http://acm.hdu.edu.cn/showproblem.php?pid=4632
Palindrome subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/Others)Total Submission(s): 2764 Accepted Submission(s): 1121
(http://en.wikipedia.org/wiki/Subsequence)
Given a string S, your task is to find out how many different subsequence of S is palindrome. Note that for any two subsequence X = <Sx1, Sx2, ..., Sxk> and Y = <Sy1, Sy2, ..., Syk> , if there exist an integer i (1<=i<=k) such that xi != yi, the subsequence X and Y should be consider different even if Sxi = Syi. Also two subsequences with different length should be considered different.
題意:求一字符串中迴文子序列的數目。
題解:dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]; 注意s[i]=s[j]時,dp[i][j]=dp[i+1][j-1]+1.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<string>
#define maxn 1005
const int mod=10007;
using namespace std;
char s[maxn];
int dp[maxn][maxn];
int main()
{
int n,m;
while(~scanf("%d",&n))
{
m=1;
while(n--)
{
scanf("%s",s);
int l=strlen(s);
memset(dp,0,sizeof(dp));
for(int i=0;i<l;i++)
dp[i][i]=1;
for(int j=0;j<l;j++)
for(int i=j-1;i>=0;i--)
{
dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+mod)%mod;
if(s[i]==s[j])
dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1+mod)%mod;
}
printf("Case %d: %d\n",m++,dp[0][l-1]);
}
}
return 0;
}