本题考点:最长公共子序列
我们要让添加的字符少,就要求出这个字符串里的最长回文子串的长度。
怎么求最长回文子串的长度呢?
我们可以把串 颠倒过来,变成
,只要求出串
与串
最长公共子序列,最后答案就是
减去这个结果啦。
标程在这里:
#include<bits/stdc++.h>
using namespace std;
char s1[1010],s2[1010];
int f[1010][1010];
int main () {
scanf("%s",1+s1);
int lens=strlen(1+s1);
for(int i=1;i<=lens;i++) s2[lens-i+1]=s1[i];//翻转
for(int i=1;i<=lens;i++) f[i][1]=f[1][i]=0;//初始化
for(int i=1;i<=lens;i++)//模板
for(int j=1;j<=lens;j++)
if(s1[i]!=s2[j]) f[i][j]=max(f[i-1][j],f[i][j-1]);
else f[i][j]=f[i-1][j-1]+1;
cout << lens-f[lens][lens];//输出
return 0;
}