给出一个字符串,问它有多少个回文字串。
状态转移方程为:
if(s[l]==s[r])//两边相同的
{
dp[l][r]=solve(l+1,r-1)+1;
}
dp[l][r]+=(solve(l+1,r)+solve(l,r-1)-solve(l+1,r-1));//减去中间重复的
还有注意它的输出格式里没有#。。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstdlib>
#include <cstring>
#include <iomaniP>
#include <algorithm>
using namespace std;
const int mod=10007;
char s[1100];
int ans;
int dp[1100][1100];
int solve(int l,int r)
{
if(dp[l][r]!=-1)
{
return dp[l][r];
}
if(l==r)
{
dp[l][r]=1;
return 1;
}
if(l+1==r)//长度为2
{
if(s[l]==s[r])
{
dp[l][r]=3;
}
else
{
dp[l][r]=2;
}
return dp[l][r];
}
dp[l][r]=0;
if(s[l]==s[r])//两边相同的
{
dp[l][r]=solve(l+1,r-1)+1;
}
dp[l][r]+=(solve(l+1,r)+solve(l,r-1)-solve(l+1,r-1));//减去中间重复的
dp[l][r]%=mod;
if(dp[l][r]<0)
{
dp[l][r]+=mod;
}
return dp[l][r];
}
int main()
{
int t;
int cas=1;
scanf("%d",&t);
getchar();
while(t--)
{
gets(s);
int len;
len=strlen(s);
int i,j;
for(i=0;i<len;i++)
{
for(j=0;j<len;j++)
{
dp[i][j]=-1;
}
}
ans=solve(0,len-1);
printf("Case %d: %d\n",cas++,ans);
}
return 0;
}