题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。 比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。 注:此问题区分大小写 输入输出格式 输入格式: 一个字符串(0<strlen<=1000) 输出格式: 有且只有一个整数,即最少插入字符数 输入输出样例 输入样例#1: Ab3bd 输出样例#1: 2
解:
回文串,即正着读和反着读的结果一样,
设s1为原串,s2为反串
题目就转化为添加最少的字符使得s1,s2两个字符串相等
即寻找最长的公共部分,剩下的就是对方所没有的,即要添加的
❤
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define DB double 4 using namespace std; 5 const int N=1010; 6 char s1[N],s2[N]; 7 int dp[N][N],len; 8 int main() 9 { 10 scanf("%s",s1+1); 11 for(int j=strlen(s1+1);j>=1;--j) s2[++len]=s1[j]; 12 for(int i=1;i<=len;++i) 13 for(int j=1;j<=len;++j) 14 if(s1[i]==s2[j]) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1); 15 else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 16 cout<<len-dp[len][len]; 17 return 0; 18 }