HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)

Posted dwtfukgv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)相关的知识,希望对你有一定的参考价值。

题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数。

析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串,

那么最后正反都得是一样的,所以我们就正反求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;
}

 

以上是关于HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3062 && HDU 1824 && POJ 3578 && BZOJ 1997 2-SAT

hdu1501&amp;&amp;poj2192 Zipper(DFS)

背包系列练习( hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092

HDU 2665 && POJ 2104(主席树)

poj2243 &amp;&amp; hdu1372 Knight Moves(BFS)

扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]