思路:用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+dp[i][j-1],但是dp[i+1][j]和dp[i][j-1]可能有公共部分,所以要减去dp[i+1][j-1]。
如果str[i]==str[j]的话,还要加上dp[i+1][j-1]+1。
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[1006][1055];
int t;
char a[1100];
const int mod = 10007;
int main() {
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
memset(dp, 0, sizeof(dp));
scanf("%s", a + 1);
int len = strlen(a + 1);
for(int i = 1; i <= len; i++) {
dp[i][i] = 1;
for(int j = i - 1; j >= 1; j--) {
dp[j][i] = (dp[j][i - 1] + dp[j + 1][i]-dp[j+1][i-1]+mod) % mod;
if(a[i] == a[j]) {
dp[j][i] += dp[j + 1][i - 1] + 1;
dp[j][i]%=mod;
}
}
}
printf("Case %d: %d\n", cas, dp[1][len]);
}
return 0;
}