题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符
分析:将该字符串与其反转求一次LCS,然后所求就是n减去最长公共子串的长度。
分析:但是要注意这里字符串最长有5000,dp[5000][5000]的话就会超内存.........
分析:再看在LCS动态规划中,当前dp[i][j]至于dp[i-1][...]相关,就是周期为2,则dp[2][5000]就实现了
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
int dp[2][5002];
char a[5002],b[5002];
int n;
void LCS(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i-1]==b[j-1]) dp[i%2][j]=dp[(i-1)%2][j-1]+1;
else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}
int main(){
while(scanf("%d",&n)!=EOF){
scanf("%s",a);
for(int i=0;i<n;i++) b[i]=a[n-i-1];
memset(dp,0,sizeof(dp));
LCS();
printf("%d\n",n-dp[n%2][n]);
}
return 0;
}