1. 程式人生 > >NAIPC2016 F (計數dp)

NAIPC2016 F (計數dp)

 dp好弱鴨

#include<iostream>
#include<cstring>
#define mod 1000000007
typedef long long ll;
using namespace std;
ll dp[110][10010];
int main(){
	ll n,w,h;
	cin>>n>>w>>h;
	
	memset(dp,0,sizeof(dp));
	dp[0][0]=1;
	for(int i=1;i<=w;i++){
		for(int j=0;j<=n;j++){
			for(int k=0;k<=h;k++){
				if(j+k>n)break;
				dp[i][j+k]=dp[i][j+k]+dp[i-1][j];
				if(dp[i][j+k]>mod) 
					dp[i][j+k]-=mod;
			}
		}
	}
//	for(ll i=1;i<=w;i++){
//		for(ll j=1;j<=n;j++)
//			cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
//	}
	ll sum=0;
	for(int i=0;i<=n;i++){
		sum+=dp[w][i];
		if(sum>mod) 
			sum-=mod;
	}
//	sum-=n/w+1;
	if(n>w*h) 
		sum-=h+1;
    else 
		sum-=n/w+1;
	while(sum<=0){
		sum+=mod;
	}sum%=mod;
	cout<<sum<<endl;
}