hdu4632 回文子序列
题:http://acm.hdu.edu.cn/showproblem.php?pid=4632
题意:问字符串的有多少个回文子序列(n<=10000)
分析:区间dp,考虑dp[i][j]表示i~j 位置含有多少个回文子序列,转移方程如代码
#include<bits/stdc++.h> using namespace std; const int M=1e3+3; const int mod=10007; int dp[M][M]; char s[M]; int main(){ int t; scanf("%d",&t); for(int p=1;p<=t;p++){ scanf("%s",s); int n=strlen(s); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) dp[i][i]=1; for(int i=0;i<n;i++) for(int j=i-1;j>=0;j--){ dp[j][i]=(dp[j+1][i]+dp[j][i-1]-dp[j+1][i-1]+mod)%mod; if(s[i]==s[j]) dp[j][i]+=dp[j+1][i-1]+1; dp[j][i]%=mod; } printf("Case %d: %d\n",p,dp[0][n-1]); } return 0; }