题意:
给你一个字符串,求非连续回文串的个数,相同的字母在不同的位置的子串不同。。
dp[i][j]表示i到j的回文串的个数
dp[i][j]=dp[i+1][j]+dp[i][j-1],
因为会有重复的,所以
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
有因为s[i]跟s[j]可能相同,所以
当s[i]==s[j]时,dp[i][j]=dp[i+1][j]+dp[i][j-1]+1;
当s[i]!=s[j]时,dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
#include"stdio.h"
#include"string.h"
#define N 1005
#define M 10007
int dp[N][N];
int main()
{
int T,t;
int i,j;
int len;
char s[N];
t=1;
scanf("%d",&T);
getchar();
while(T--)
{
gets(s);
len=strlen(s);
memset(dp,0,sizeof(dp));
for(i=0;s[i];i++)
dp[i][i]=1;
for(i=1;i<len;i++)
{
for(j=i-1;j>=0;j--)
{
dp[j][i]=dp[j][i-1]+dp[j+1][i]-dp[j+1][i-1]+M;
if(s[i]==s[j])dp[j][i]=dp[j][i]+dp[j+1][i-1]+1+M;
dp[j][i]%=M;
}
}
printf("Case %d: %d\n",t++,dp[0][len-1]);
}
return 0;
}