好久没写区间dp了,手好生的说。
注意取余完之后再减可能出现负值的情况,单独考虑一下,其他倒是没什么了,很标准的区间dp
附代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1005][1005];
char s[1005];
const int mod=10007;
int DP(int l,int r)
{
if (l>r)
return 0;
if (l==r)
{
dp[l][r]=1;
return 1;
}
if (dp[l][r]!=-1)
return dp[l][r];
dp[l][r]=(DP(l+1,r)+DP(l,r-1)-DP(l+1,r-1));
if (s[l]==s[r])
dp[l][r]+=(DP(l+1,r-1)+1);
if (dp[l][r]<0)
dp[l][r]+=mod;
dp[l][r]%=mod;
return dp[l][r];
}
int main()
{
int T;
cin>>T;
for (int r=1;r<=T;r++)
{
memset(dp,-1,sizeof(dp));
scanf("%s",s);
DP(0,strlen(s)-1);
printf("Case %d: %d\n",r,dp[0][strlen(s)-1]);
}
}