题意:
看需要增加几个字母可以使该串变成回文串
思路:
LCS的扩展,把串反过来,然后找他们的最长公共子序列的长度,用n减去这个数就可以了
方法1: LCS普通
CODE
49720K 688ms
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
short c[5005][5005];
char x[5005], y[5005];
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",x);
int i, j;
j = 0;
for(i = n-1; i >= 0;i--)
y[j++] = x[i];
y[j] = '\0';
for(i = 0; i <= n; i++)
{
c[0][i] = 0;
c[i][0] = 0;
}
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(x[i-1]==y[j-1])
c[i][j] = c[i-1][j-1]+1;
else
if(c[i-1][j]>c[i][j-1])
c[i][j] = c[i-1][j];
else
c[i][j] = c[i][j-1];
printf("%d\n",n-c[n][n]);
}
return 0;
}
方法2 滚动数组
CODE
736K 797ms
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
short c[2][5005];
char x[5005], y[5005];
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
cin>>x[i];
x[n+1]='\0';
for(i=1;i<=n;i++)//字符串str1的逆串
y[i]=x[n-i+1];
int e = 0;
memset(c,0,sizeof(c));
for(i = 1; i <= n; i++)
{
e = 1-e;
for(j = 0; j <= n; j++)
{
if(x[i]==y[j])
{
c[e][j] = c[1-e][j-1]+1;
}
else
{
int len1 = c[e][j-1];
int len2 = c[1-e][j];
if(len1 >len2) c[e][j] =len1;
else
c[e][j] = len2;
}
}
}
printf("%d\n",n-c[e][n]);
}
return 0;
}