题意:给你红色砖块和绿色分别为n和m块,让这些砖块组成每层递减1的 塔,每一层的颜色必须一样,问你迭到最高层有多少种方法

解题思路:dp[i][j] 表示第i层用了j个红色砖块。

解题代码:

 1 // File Name: 478d.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月13日 星期五 08时42分21秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 #define maxn 410005
26 #define M 1000000007
27 using namespace std;
28 LL dp[maxn] ;
29 int main(){
30     int n , m;
31     scanf("%d %d",&n,&m);
32     dp[0] = 1;
33     int flor  = 1 ; 
34     for(flor ;;flor ++ )
35     {
36        if(flor*(flor+1) /2 <= n + m && (flor+2)*(flor+1)/2 > n + m )
37            break;
38     }
39     for (int i = 1;i <= flor ;i ++)    
40     {
41          int mx = i*(i+1)/2;
42          int tt = min(mx,n);
43          for(int j = tt ;j >= 0; j --)
44          {
45             if(mx -j > m)
46             {
47               dp[j] = 0 ; 
48             }
49             if(j <= n && j -i >= 0 )
50                 dp[j] =(dp[j]+dp[j-i]) % M;
51          }
52     }
53     LL sum = 0 ; 
54     for(int i = 0;i <= n;i ++)
55     {
56           sum = (sum + dp[i]) % M ;
57     }
58     printf("%I64d\n",sum);
59 return 0;
60 }
View Code

 

posted on 2015-03-13 14:54  dark_dream  阅读(272)  评论(0编辑  收藏  举报