hdu 4362(dp求非连续回文串的个数)

来源:互联网 发布:哈尔滨数据开放平台 编辑:程序博客网 时间:2024/05/22 04:43

点击打开链接


题意:

给你一个字符串,求非连续回文串的个数,相同的字母在不同的位置的子串不同。。


dp[i][j]表示i到j的回文串的个数

dp[i][j]=dp[i+1][j]+dp[i][j-1],

因为会有重复的,所以

dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];

有因为s[i]跟s[j]可能相同,所以

当s[i]==s[j]时,dp[i][j]=dp[i+1][j]+dp[i][j-1]+1;

当s[i]!=s[j]时,dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];


#include"stdio.h"#include"string.h"#define N 1005#define M 10007int dp[N][N];int main(){int T,t;int i,j;int len;char s[N];t=1;scanf("%d",&T);getchar();while(T--){gets(s);len=strlen(s);memset(dp,0,sizeof(dp));for(i=0;s[i];i++)dp[i][i]=1;for(i=1;i<len;i++){for(j=i-1;j>=0;j--){dp[j][i]=dp[j][i-1]+dp[j+1][i]-dp[j+1][i-1]+M;if(s[i]==s[j])dp[j][i]=dp[j][i]+dp[j+1][i-1]+1+M;dp[j][i]%=M;}}printf("Case %d: %d\n",t++,dp[0][len-1]);}return 0;}



原创粉丝点击