题意:给你红色砖块和绿色分别为n和m块,让这些砖块组成每层递减1的 塔,每一层的颜色必须一样,问你迭到最高层有多少种方法
解题思路:dp[i][j] 表示第i层用了j个红色砖块。
解题代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }