hdu1153 dp回文

这题没想到用反串LCS,算是回顾了LCS吧

lcs最长子序列,刚开始忘了还以为是连续的子序列,额...搞了好久,现在应该不会忘了,还回顾了滚动数组,原来是上次还是不稳呀

现在求构成回文需要的min,转化为 n-原序列最大回文子序列

突然想起来好像在算法导论看到过用lcs求回文=.=

//lcs求回文
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <stack>
#include <queue>


const int inf = (1<<31)-1;
const int MAXN = 5e3+10;
using namespace std;
int dp[MAXN][2];
char s1[MAXN],s2[MAXN];

int main(){
    int n;
    while(~scanf("%d",&n)){
        scanf("%s",s1);
        for(int i=0;i<n;i++)
            s2[i] = s1[n-i-1];
       // printf("%s\n",s2);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(s1[i-1]==s2[j-1])
                    dp[j][i%2] = dp[j-1][(i-1)%2]+1;
                else
                    dp[j][i%2] = max(dp[j-1][i%2],dp[j][(i-1)%2]);
            }
        }
        cout<<n-dp[n][n%2]<<endl;
    }
    return 0;
}
//14
//aababaaaabbbba
//abbbbaaaababaa
//14
//abbbbaaaababaa
//aababaaaabbbba
View Code

 

posted @ 2016-04-14 19:36  iEdson  阅读(123)  评论(0编辑  收藏  举报