题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数。
析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串,
那么最后正反都得是一样的,所以我们就正反求LCS,这样公共的就求出来了,那么再用总数减掉这个LCS,
那么剩下的肯定就是没有配对的了,就得必须加上了。
思路有了,这里又出现一个问题,这个求LCS,要用的空间复杂度太大了,MLE了。。。有了思路,还是过不了,
这个题应该用滚动数组来做,我想想在求LCS时,第一维我们只用到了i-1和i,所以呢,我们第二维只要开2行就够了,
不断的来回存储,第一行和第二行反复,这样就OK了,至此这个题也就解决了。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 5000 + 10; int d[2][maxn]; char s[maxn], t[maxn]; int main(){ int n; while(~scanf("%d", &n)){ scanf("%s", s+1); for(int i = 1; i <= n; ++i) t[i] = s[n-i+1]; t[n+1] = ‘\0‘; memset(d, 0, sizeof(d)); for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j){ int x = i % 2; int y = 1 - x; if(s[i] == t[j]) d[x][j] = d[y][j-1] + 1; else d[x][j] = max(d[y][j], d[x][j-1]); } printf("%d\n", n - d[n%2][n]); } return 0; }
时间: 2024-10-03 23:10:18