求最少插入多少个字符使原字符串成为一个回文串。
用字符的正向串和逆向求出最长公共子序列即可知道需要添加的字符数目。
学到一点关于滚动数组的知识。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX=5050;
char str1[MAX],str2[MAX];
int dp[2][MAX];
int main(){
int a;
scanf("%d",&a);
scanf("%s",str1);
memset(dp,0,sizeof(dp));
for(int i=a-1;i>=0;i--)
str2[a-i-1]=str1[i];
for(int i=0;i<a;i++)
for(int j=0;j<a;j++)
{
if(str1[i]==str2[j])
{
if(j!=0)dp[i&1][j]=dp[(i+1)&1][j-1]+1;
else dp[i&1][j]=1;
}
else{
if(j!=0)dp[i&1][j]=max(dp[(i+1)&1][j],dp[i&1][j-1]);
else dp[i&1][j]=0;
}
}
printf("%d\n",a-dp[1&(a-1)][a-1]);
return 0;
}