uva 1362(区间dp+计数)

构思上还是比较简单,我们可以递归的思考问题。每一个字符串都包含三部分根节点str[0]左子树str[1]-str[k]与右子树str[k+1]-str[n-1]根据乘法原理

整棵树的方案数=左子树方案数*右子树方案数。这样一分析我们可以看到了这是一个区间上动态规划的问题。

剩下来的就简单了,先套一下模版三层循环,再把式子列上去就ok了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define ll long long
 6 #define MOD 1000000000
 7 #define LEN 310
 8 using namespace std;
 9 
10 ll dp[LEN][LEN];
11 char str[LEN];
12 int n;
13 
14 int main()
15 {
16 //    freopen("in.txt", "r", stdin);
17 
18     while(scanf("%s", str)!=EOF){
19         memset(dp, 0, sizeof dp);
20         n = strlen(str);
21         for(int i=0; i<n; i++) dp[i][i] = 1;
22         for(int k=1; k<n; k++){
23             for(int i=0; i+k<n; i++){
24                 int j = i+k;
25                 for(int x=i+2; x<=j; x++){
26                     if(str[x]==str[j] && str[i+1]==str[x-1] && str[i]==str[x])
27                         dp[i][j] += dp[i+1][x-1]*dp[x][j]%MOD;
28                     dp[i][j] %= MOD;
29                 }
30             }
31         }
32         printf("%lld\n", dp[0][n-1]%MOD);
33     }
34     return 0;
35 }
View Code

 

posted @ 2013-11-08 09:07  张小豪  阅读(206)  评论(0编辑  收藏  举报