用dp[i,j]表示原字符串中[i,j]回文串的个数
dp[i,j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
因为中间[i+1,j-1]段会被重复计算,所以减去
如果str[i+1]==str[j-1]
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+dp[i+1][j-1]+1;
dp[i][j]要在原来的基础上加上str[i]跟str[j]与[i+1,j-1]之间的回文串的个数
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define mod 10007
using namespace std;
char str[1005];
int dp[1005][1005];
int main()
{
int i,j,t,icase=0,n;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
icase++;
scanf("%s",&str);
n=strlen(str);
for(i=0;i<n;i++)
dp[i][i]=1;
for(i=1;i<n;i++)
{
for(j=0;j+i<n;j++)
{
if(str[j]==str[j+i])
{
dp[j][j+i]=(dp[j+1][i+j]+dp[j][j+i-1]+1);
dp[j][i+j]=(dp[j][i+j]+mod)%mod;
}
else
{
dp[j][i+j]=(dp[j][j+i-1]+dp[j+1][i+j]-dp[j+1][i+j-1]);
dp[j][i+j]=(dp[j][i+j]+mod)%mod;
}
}
}
printf("Case %d: %d\n",icase,dp[0][n-1]);
}
return 0;
}