给出一个字符串,问你需要加多少个字符可以使得这个字符串变成回文字符串。一开始就猜到了,答案等于字符串长度-字符串和逆序字符串的最长公共子序列;开了一个dp[5000][5000] 直接MLE。要用滚动碉数组。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
char s1[5010],s2[5010];
int dp[2][5010];
int main()
{
int n;
while(~scanf("%d",&n))
{
getchar();
memset(dp,0,sizeof(dp));
scanf("%s",s1);
int j=0;
for(int i = n-1 ; i >= 0 ; i--)
{
s2[j++] = s1[i];//逆序字符串。
}
for(int i = 1 ; i <= n ; i++)
{
for(int k = 1 ; k <= n ; k++)
{
if(s1[i-1] == s2[k-1]) dp[i%2][k] = dp[(i-1)%2][k-1]+1;
else dp[i%2][k] = max(dp[i%2][k-1],dp[(i-1)%2][k]);
}
}
printf("%d\n",n-dp[n%2][n]);
}
return 0;
}