区间DP
代码如下:
#include <bits/stdc++.h>
using namespace std;
long long dp[110][110];
int main ()
{
// freopen("E:\\1.in", "r", stdin);
// freopen("E:\\1.out", "w", stdout);
int t, cnt = 1;
scanf("%d", &t);
while(t--)
{
char s[110];
scanf("%s", s+1);
printf("Case %d: ", cnt++);
memset(dp, 0, sizeof(dp));
int n = strlen(s+1);
for(int i = 0;i <= n;i++) dp[i][i] = 1;
for(int i = n;i > 0;i--)
{
for(int j = i+1;j <= n;j++)
if(s[i] == s[j]) dp[i][j] = dp[i+1][j] + dp[i][j-1] + 1;
else dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]; //减去重复区间
}
printf("%lld\n", dp[1][n]);//lightoj用%I64d错误
}
return 0;
}