【动态规划】构造回文

时间限制:1秒

空间限制:32768K

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子1:

abcda google

输出例子1:

2
2

dp。

输入未知个数的string可以用while(cin >> s)~ 

#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<sstream>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];
int main(){
    string s;
    while(cin >> s){
        fill(dp[0], dp[0]+maxn*maxn, 0);
        int len = s.length();
        for(int i = 0; i < len; i++){
            dp[i][i] = 1;
            if(i!=0){
                if(s[i] == s[i-1])
                    dp[i-1][i] = 2;
                else
                    dp[i-1][i] = 1;
            }
        }
        for(int i = 3; i <= len; i++){
            for(int st = 0; st+i-1<len; st++){
                int ed = st+i-1;
                if(s[st] == s[ed]){
                    dp[st][ed] = max(dp[st+1][ed-1]+2, max(dp[st+1][ed], dp[st][ed-1]));
                }
                else{
                    dp[st][ed] = max(dp[st+1][ed-1], max(dp[st+1][ed], dp[st][ed-1]));
                }

            }
        }
        cout << len-dp[0][len-1] << endl;
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章