Codeforces 478D Red-Green Towers (DP)

75 篇文章 0 订阅

题意:有r个红砖块和b个绿砖块,用这些砖块建一个塔,假设塔有h层,则从下往上第i层有h-i+1个同种颜色的砖块。问有多少种方案使塔的高度最高。

解析:塔的最大高度很容易求得。h最大不过700。

设h是塔的最大高度,dp[i][j]为建i层塔用j个红砖块的方案数。

则 dp[i][j] = sigma(dp[k][j])+dp[i-1][j-i] (1<=k<=i-1)

因空间会爆,所以用滚动数组。

[code]:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;
const int maxn = 2e5+5;

int n,m,h;
LL dp[maxn];

int main(){
    int i,j,d;
    scanf("%d%d",&n,&m);
    for(h = 0;(h+1)*(h+2)/2<=n+m;h++);
    dp[0] = 1;
    for(i = 1;i <= h;i++){
        for(j = n;j>=i;j--)
            dp[j] = (dp[j]+dp[j-i])%MOD;
    }
    LL ans = 0;
    for(i = max(0,h*(h+1)/2-m);i<=n;i++){
        ans = (ans + dp[i])%MOD;
    }
    printf("%I64d\n",ans);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值