Codeforces478D-Red-Green Towers-DP

 不是特别难的一道dp题。

给r个红块,g个绿块,计算这些块能磊出的最高塔的方案数。

塔的每一层都比上一层多一块,每一层只能有一种颜色。

 

dp[i][j]表示第i层,j个红块的方案数。

则dp[i][j] = dp[i-1][j] + dp[i-1][j-i].注意一下方案的转移和最终结果的统计。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 2e5+10;
 8 const int mod = 1e9+7;
 9 
10 int r,g;
11 int dp[maxn];
12 
13 int main()
14 {
15     scanf("%d%d",&r,&g);
16     memset(dp,0,sizeof dp);
17 
18     int ans = 0,oans;
19     if(r > 0) dp[1]++;
20     if(g > 0) dp[0]++;
21     oans = dp[0]+dp[1];
22     for(int i=2;i<1000;i++)
23     {
24         bool flag = false;
25         int tol = i*(i+1)/2;
26         int bgn = min(r,tol);
27         ans = 0;
28 
29         for(int j=bgn;j>=0;j--)
30         {
31             bool flag_g = false;
32             if((tol-j) <= g && dp[j])
33             {
34                 dp[j] = dp[j];
35                 dp[j] %= mod;
36                 flag = true;
37                 flag_g = true;
38                 ans += dp[j];
39                 ans %= mod;
40             }
41             if(j >= i && dp[j-i])
42             {
43                 dp[j] += dp[j-i];
44                 dp[j] %= mod;
45                 flag = true;
46                 flag_g = true;
47                 ans += dp[j-i];
48                 ans %= mod;
49             }
50             if(!flag_g)
51                 dp[j] = 0;
52             //printf("i:%d j:%d dp:%d\n",i,j,dp[j]);
53         }
54         if(!flag)
55         {
56             break ;
57         }
58         oans = ans;
59     }
60     printf("%d\n",oans);
61 }

 

posted @ 2016-05-28 17:54  Helica  阅读(183)  评论(0编辑  收藏  举报