程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> FZU Problem 2156 Climb Stairs DP

FZU Problem 2156 Climb Stairs DP

編輯:C++入門知識

 

題目大意:

爬樓梯,要爬到n這個位置,每次可以走x也可以走y,然後一定要經過A和B兩點,求最終到達n的方案數。

思路:

昨天FZU月賽題,今天小伙伴問我的- -|||,晚上回來敲完,發現有校!!選!!!課!!!!!哭

因為一定要到達A和B,那麼直接分成0~A,A~B,B~N遞推就好了。

注意每次不要越界,比如0~A,那麼不要超過A。因為你可能超過A,沒有到A,對後面的累加有影響。(結果偏大)

詳見代碼。

 

#include
#include
#include
using namespace std;
const int MAXN=10000+10;
const int mod=1000000007;
__int64 f[MAXN];
int n,x,y,a,b;
void solve(int L,int R)
{	
		for(int i=L;i<=R;i++)
		{
			if(i+x<=R)
				f[i+x]=(f[i]+f[i+x])%mod;
			if(i+y<=R)
				f[i+y]=(f[i]+f[i+y])%mod;
		}		
}
int main()
{
	while(~scanf(%d%d%d%d%d,&n,&x,&y,&a,&b))
	{
		memset(f,0,sizeof(f));
		if(a>b) swap(a,b);
		f[0]=1;
		solve(0,a);
		solve(a,b);
		solve(b,n);
		printf(%I64d
,f[n]%mod);
	}
	return 0;
}


 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved