http://poj.org/problem?id=1159
题目大意: 给你一个n 代表n个字符 第二行给你一个字符串 求使这个字符串变成回文字符串 最少需要添加多少个字符
分析: 原来的字符串长度-原来的字符串与逆置后的字符串的最长公共字串 就是求得的添加的字符
但是n是5000 如果单用dp[N][N] 肯定会内存超限 所以我们用滚动数字
这是我第一次接触滚动数字 好像也是dp的一种 就是把第一维变成2 反正每一次i j 都只用到上一层
#include<cstdio> #include<cstring> #include<stack> #include<vector> #include<queue> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define N 5100 #define INF 0xfffffff #define memset(a,b) memset(a,b,sizeof(a)) int dp[2][N]; char str[N],ch[N]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(dp,0); memset(str,0); memset(ch,0); scanf("%s",str); int l=strlen(str); for(int i=0;str[i];i++) ch[i]=str[l-i-1]; for(int i=0;str[i];i++) { for(int j=0;ch[j];j++) { if(str[i]==ch[j]) dp[(i+1)%2][j+1]=dp[i%2][j]+1; else { dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]); } } } printf("%d ",l-dp[l%2][l]); } return 0; }