这题想了一下,可以枚举出str[i]、str[j]的所有决策:
1、如果str[i] == str[j],不删除str[i] str[j]:dp[i][j] += dp[i+1][j-1] + 1(1表示把[i+1,j-1]全删除后,它还是回文);
2、删除str[i]:就是dp[i+1][j];
3、删除str[j]:就是dp[i][j-1];
4、同时删除str[i]、str[j]:就是dp[i+1][j-1];注意2和3的重合就是4情况。
过了样例,提交居然WA了!一看网上的代码,居然是64位!于是改成long long。AC!
//uva_10617.c
#include <stdio.h>
#include <string.h>
#define N 70
char str[N];
long long dp[N][N];
int main()
{
int i, j, n, t;
scanf("%d", &t );
while ( t -- ) {
scanf("%s", str );
memset( dp, 0, sizeof(dp) );
n = strlen(str);
for ( i = 0; i < n; ++ i )
dp[i][i] = 1;
for ( i = n-2; i >= 0; -- i ) {
for ( j = i+1; j < n; ++ j ) {
if ( str[i] == str[j] ) { //no remove
dp[i][j] = dp[i+1][j-1] + 1; //1表示i+1-->j-1全部删除
}
dp[i][j] += dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];
}
}
printf("%lld\n", dp[0][n-1] );
}
return 0;
}