codeforces D - Red-Green Towers

  因为构建到第i层时所需砖块总数是一定的,所以我们只需要考虑构建到第i层时用了多少块红砖,到最后将符合条件的情况相加即可。令DP[i][j]表示构建到第i层,且此时使用了j个红色砖块,那么DP[i][j]=DP[i-1][j-i],滚动数组实现即可,循环完成后只需将所有满足h*(h+1)-i<g条件的相加即可。

#include <iostream>
using namespace std;
long long dp[200010]={1};
const long long MOD=1000000007;
int main()
{
	int r,g;
	cin>>r>>g;
	int h=1,sum=(r+g)<<1;
	while((h*(h+1))<=sum) h++;
	h--;
	sum=0;
	for(int i=1;i<=h;i++)//i表示层数,滚动数组
		for(int j=r;j>=i;j--) dp[j]=(dp[j]+dp[j-i])%MOD;
	sum=(h*(h+1))>>1;
	if((sum-g)<0) sum=0;
	else sum-=g;//一定要判断sum取值是否小于0 1 100000
	long long ans=0;
	for(int i=sum;i<=r;i++)
		ans=(ans+dp[i])%MOD;//将所有可能情况相加
	cout<<ans<<endl;
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值