#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1000+5;
const int mod = 10007;
long long dp[maxn][maxn];
char str[maxn];
int main() {
freopen("data.in", "r", stdin);
int t, cas;
scanf("%d", &t);
for(int cas = 1; cas <= t; ++cas) {
scanf("%s", &str);
memset(dp, 0, sizeof(dp));
int n = strlen(str);
for(int i = 0; i < n; ++i)
dp[i][i] = 1;
for(int i = 0; i < n-1; ++i)
dp[i][i+1] = (str[i] == str[i+1] ? 3 : 2);
for(int l = 3; l <= n; ++l) {
for(int i = 0; i <= n-l; ++i) {
int j = i + l - 1;
dp[i][j] = (dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] + mod)%mod;
if(str[i] == str[j]) {
//如果区间两头是相等的,则要加上dp[i+1][j-1]+1,
//因为首尾是可以组成一个回文子串的,而且首尾可以与中间任何一个回文子串组成新的回文子串
dp[i][j] = (dp[i][j]+ dp[i+1][j-1]+1)%mod;
}
}
}
printf("Case %d: %d\n", cas, dp[0][n-1]);
}
return 0;
}
HDU 4632 Palindrome subsequence(区间DP)
最新推荐文章于 2024-02-03 13:30:00 发布