/*
最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度
*/
# include <stdio.h>
# include <algorithm>
# include <iostream>
# include <string.h>
using namespace std;
int dp[2][5010];///滚动数组
int main()
{
char a[5010];
char b[5010];
int i,j,k,len;
while(~scanf("%d",&len))
{
scanf("%s",a);
k=0;
for(i=len-1;i>=0;i--)
b[k++]=a[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(a[i-1]==b[j-1])
dp[1][j]=dp[0][j-1]+1;
else
dp[1][j]=max(dp[0][j],dp[1][j-1]);
}
for(j=1;j<=len;j++)
dp[0][j]=dp[1][j];
}
printf("%d\n",len-dp[1][len]);
}
return 0;
}
poj 1159 Palindrome (lcs,滚动数组)
最新推荐文章于 2022-05-16 16:41:42 发布