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 }