hdu 4632 Palindrome subsequence DP

题意:给你一个字符串,问你整个字符串有多少个回文字串。(可以不连续)

状态方程 dp[i][j] = dp[i+1][j]+dp[i][j-1]+dp[i+1][j-1]+(a[i] == a[j]? 0:1;)

对于长度为1 2 3 的时候特判一下就可以了。

当然状态方程在些的时候会有改动,详细的还是看代码吧。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <vector>
 7 #include <queue>
 8 #define loop(s,i,n) for(i = s;i < n;i++)
 9 #define cl(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 const int mod  = 10007;
12 char str[1005];
13 int dp[1005][1005];
14 int main()
15 {
16     int t;
17     
18     scanf("%d",&t);
19     int cas;
20     cas = 0;
21     while(t--)
22     {
23         scanf("%s",str);
24         int i,j,len;len = strlen(str);
25         printf("Case %d: ",++cas);
26 
27         memset(dp,0,sizeof(dp));
28         for(i = 0;i < len;i++)
29             dp[i][i] = 1;
30         for(j = 2;j <= len;j++)
31         for(i = 0;i < len && i+j-1 < len;i++)
32         {
33             dp[i][i+j-1] = (dp[i+1][i+j-1]+dp[i][i+j-2]-dp[i+1][i+j-2])%mod;//减去中间重复计算的部分
34 
35             if(str[i] == str[i+j-1])
36             {
37                 if(j > 2)
38                 dp[i][i+j-1] =(dp[i][i+j-1]+ dp[i+1][i+j-2]+1)%mod;//大于2的时候计算一下中间的部分
39                 else
40                 {
41                     dp[i][i+j-1] += 1;
42                     dp[i][j+i-1] %= mod;
43                 }
44             }
45         }
46         if(dp[0][len-1] < 0)
47         dp[0][len-1] += mod;//如果是负数要计算下+mod
48         printf("%d
",dp[0][len-1]);
49     }
50     return 0;
51 }
View Code
原文地址:https://www.cnblogs.com/0803yijia/p/3232500.html