其实就是求最长回文子序列的长度m 然后 答案就是length - m
求最长回文子序列:
dp[i][j] 表示i-j中最长回文子序列的长度
dp[i][j] = max( dp[i][j], dp[k+1][j-1] + 2 ) ( i <=k < j );// 注意这里是+2 因为每增加一对增加的长度为2
初始化dp[i][i] = 1;
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int dp[110][110];
int main(){
int T, Case = 1, length;
char s[110];
cin >> T;
while( T-- ){
cin >> s;
length = strlen( s );
memset( dp, 0, sizeof( dp ) );
for( int i = 1; i <= length; i++ ){
dp[i][i] = 1;
}
for( int i = length; i >= 1; i-- ){
for( int j = i; j <= length; j++ ){
dp[i][j] = max( dp[i][j], dp[i][j-1] );
for( int k = i; k < j; k++ ){
if( s[k-1] == s[j-1] ){
dp[i][j] = max( dp[i][j], dp[k+1][j-1] + 2 );
}
}
}
}
cout << "Case " << Case++ << ": " << length - dp[1][length] << endl;
}
return 0;
}