/*
最少需要补充的字母数 = 原序列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-04-05 17:43:55 发布
本文介绍了一种用于计算两个字符串(其中一个为另一个的反转)的最长公共子串的算法,并通过此算法来确定最少需要补充多少字母使得两字符串相同。采用滚动数组优化空间复杂度。
1217

被折叠的 条评论
为什么被折叠?



