HDU-4632-Palindrome subsequence

来源:互联网 发布:淘宝旺铺基础版店招 编辑:程序博客网 时间:2024/05/17 08:24

这个题要求你求出所给字符串中共有多少个回文子串,用动态规划做。

我的动态规划转移方程是

dp[i][j]=max(dp[i][j],dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1])

注意由小区间到大区间进行计算,剩下的就是取余的时候需要注意下

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=1100;const int mod=10007;char str[maxn];int n,dp[maxn][maxn];int main(){    int T,cas=1;    scanf("%d",&T);    while(T--)    {memset(dp,0,sizeof(dp));scanf("%s",str);int n=strlen(str);for(int j=0;j<=n;j++)    for(int i=j;i>=0;i--)    {dp[i+1][j+1]=max(dp[i+1][j+1],(dp[i+1][j]+dp[i+2][j+1]-dp[i+2][j]+mod)%mod);if(str[i]==str[j])    dp[i+1][j+1]=(dp[i+1][j+1]+1+dp[i+2][j])%mod;    }printf("Case %d: %d\n",cas++,dp[1][n]);    }    return 0;}