时间限制: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;
}