4 a aaaaa goodafternooneveryone welcometoooxxourproblems
Case 1: 1 Case 2: 31 Case 3: 421 Case 4: 960
zhuyuanchen520
给出一个串问区间有多少个回文子串
dp[i][j]表示第i个到第j个有dp[i][j]个子串
当str[i]==str[j]时候可以知道dp[i][j]=(dp(i,j-1)+dp(i+1,j)+)%mod
否则dp[i][j]=(dp[i][j-1]+dp[i+1][j]-dp[x+1][y+1]+mod)%mod可能出现负值
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制 #pragma comment(linker, "/STACK:102400000,102400000")//手工开栈 #include <map> #include <set> #include <queue> #include <cmath> #include <stack> #include <cctype> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rds(x) scanf("%s",x) #define rdc(x) scanf("%c",&x) #define ll long long int #define maxn 1001 #define mod 10007 #define INF 0x3f3f3f3f //int 最大值 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i) #define MT(x,i) memset(x,i,sizeof(x)) #define PI acos(-1.0) #define E exp(1) using namespace std; int loop,dp[maxn][maxn],cnt=1,len; char str[1010]; int DP(int x,int y){ if(x>y)return 0; if(x==y)return 1; if(dp[x][y])return dp[x][y]; if(str[x-1]==str[y-1]) return dp[x][y]=(DP(x,y-1)+DP(x+1,y)+1)%mod; return dp[x][y]=(DP(x,y-1)+DP(x+1,y)-DP(x+1,y-1)+mod)%mod; } int main(){ rd(loop); while(loop--){ rds(str);MT(dp,0); len=strlen(str); printf("Case %d: %d\n",cnt++,DP(1,len)); } return 0; } /* 4 a aaaaa goodafternooneveryone welcometoooxxourproblems */