FZU Problem 2156 Climb Stairs DP

本文介绍了一道经典的爬楼梯问题,要求从起点出发,每次可以选择前进x步或y步,必须经过A和B两个检查点,最终达到n的位置。通过将问题分解为三个子区间,并使用动态规划的方法来求解方案数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.fzu.edu.cn/problem.php?pid=2156

题目大意:

爬楼梯,要爬到n这个位置,每次可以走x也可以走y,然后一定要经过A和B两点,求最终到达n的方案数。

思路:

昨天FZU月赛题,今天小伙伴问我的- -|||,晚上回来敲完,发现有校!!选!!!课!!!!!哭

因为一定要到达A和B,那么直接分成0~A,A~B,B~N递推就好了。

注意每次不要越界,比如0~A,那么不要超过A。因为你可能超过A,没有到A,对后面的累加有影响。(结果偏大)

详见代码。


#include<cstdio>
#include<cstring>
#include<algorithm>
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\n",f[n]%mod);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值