dp[i][j] 表示从i到j的种类数,然后分要j不要j 要j的时候分只有j还是和其他配对(注意在与其他配对的时候要+1)
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
long long dp[61][61];
int main(){
int T, Case = 1;
char s[65];
cin >> T;
while( T-- ){
scanf( "%s", s );
memset( dp, 0, sizeof( dp ) );
int length = strlen( s );
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] += dp[i][j-1];
for( int k = i; k < j; k++ ){
if( s[j-1] == s[k-1] ){
dp[i][j] += dp[k+1][j-1] + 1;
}
}
if( i != j ){
dp[i][j]++;
}
}
}
cout << "Case " << Case++ << ": " << dp[1][length] << endl;
}
return 0;
}