标签:
4 a aaaaa goodafternooneveryone welcometoooxxourproblems
Case 1: 1 Case 2: 31 Case 3: 421 Case 4: 960
/*
题意:问一个字符串的会问序列有多少个
dp[i][j]=(dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]);
if(c[i]==c[j]) 那么加上中间的dp[i+1][j-1],因为可以和i,j形成新的
还要加上 1 (i 和 j 形成字符串)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define bug printf("hihi\n")
#define eps 1e-8
typedef __int64 ll;
using namespace std;
#define mod 10007
#define INF 0x3f3f3f3f
#define N 1005
int dp[N][N];
int len;
char c[N];
int main()
{
int i,j,t,ca=0;
scanf("%d",&t);
while(t--)
{
scanf("%s",c);
len=strlen(c);
memset(dp,0,sizeof(dp));
for(i=0;i<len;i++)
dp[i][i]=1;
for(i=len-1;i>=0;i--)
for(j=i+1;j<len;j++)
{
dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+mod)%mod;
if(c[i]==c[j])
dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1+mod)%mod;
}
printf("Case %d: %d\n",++ca,(dp[0][len-1]+mod)%mod);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4632 Palindrome subsequence(区间dp)
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/46830393