2019-2020 ACM-ICPC Latin American Regional Programming Contest Finished F - Fabricating Sculptures dp

#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

int read()
{
	int res=0,ch,flag=0;
	if((ch=getchar())=='-')             //判断正负
		flag=1;
	else if(ch>='0'&&ch<='9')           //得到完整的数
		res=ch-'0';
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+ch-'0';
	return flag?-res:res;
}
const ll mod = 1e9+7;
const int N = 5000+10;
int n, m;
ll dp[N][N];
ll sum2[N];
ll sum1[N];
void solve()
{
	int s=read(),b=read();
	b-=s;
	//底部长度为i
	//dp[i,j]=dp[i,j-i]+2*dp[i-1,j-(i-1)]+3*dp[i-2,j-(i-2)]+...+
	//
	for(int i=1; i<=s; ++i)
		for(int j=0; j<=b; ++j)
		{
			//剩下的

			sum2[j]=(sum2[j]+sum1[j])%mod;
			//底部为i,还有j
			if(j==0)
				dp[i][j]=1;
			else
				//底部是i,剩余j块儿
				//也就是 除了底部的话,剩下的块是j
				//那么也就是说  往上的j块儿,随便放,只要符合条件就行
				dp[i][j]=sum2[j];

			//总数是i+j
			//这里累加到总的方案数里的i 都是 小于s的,
			//在i=i+1时,当前加到里面的所有的方案的i 都是小于 此时的i的,那么也就成立了
			sum1[j+i]=(dp[i][j]+sum1[j+i])%mod;
		}

	cout<<dp[s][b]<<endl;
}
int main()
{
	int t=1;
	while(t--)
		solve();
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/12665048.html