题意:
添加最少字母,使字母变成回文串。
思路:
开个数组将字符串倒着读入,求两个字符串的最长公共子序列,然后用字符串原有的长度减去最长公共子序列。
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
char a[5010],b[5010];
int map[3][5010];
int N,i;
while(scanf("%d %s",&N,a)!=EOF)
{
for(int i=0;i<N;i++)
b[N-i-1]=a[i];
memset(map,0,sizeof(map));
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
map[0][j]=map[1][j];
for(int j=1; j<=N; j++)
{
if(a[i-1]==b[j-1])
map[1][j]=map[0][j-1]+1;
else
map[1][j]=max(map[0][j],map[1][j-1]);
}
}
printf("%d\n",N-map[1][N]);
}
return 0;
}