题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4632
题意是找一个字符串有多少个字串是回文字串,字串可以不连续
就是一个dp a[i][j] 表示在i和j的范围中有多少个字串是回文字
如果是s[i]=s[j]
则 a[j][j+i]=a[j+1][j+i]+a[j][j+i-1]+1
否则 a[j][j+i]=a[j+1][j+i]+a[j][j+i-1]-a[j+1][j+i-1]
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 1010
int a[MAX][MAX];
int b[MAX][MAX];
char s[MAX];
int main()
{
int n;
scanf("%d",&n);
int T=0;
while(n--)
{
T++;
scanf("%s",s);
int L= strlen(s);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0][0]=1;
for(int i=1; i<L; i++)
a[i][i]=1;
for(int i=1; i<L; i++)
{
for(int j=0; j<L-i; j++)
{
a[j][j+i]=0;
if(s[j]==s[j+i])
a[j][j+i]=(a[j+1][j+i]+a[j][j+i-1]+1)%10007;
else
a[j][j+i]=(a[j+1][j+i]+a[j][j+i-1]-a[j+1][j+i-1]+10007)%10007;
}
}
printf("Case %d: %d\n",T,a[0][L-1]);
}
}