台阶问题 (C++)

文章介绍了如何解决到达第N级台阶的不同方式数问题,给出了两种方法:一种利用等比数列的性质,当n≤k时,第n项等于前一项的两倍取模;另一种是动态规划,通过迭代计算每一步的走法。两种方法均涉及取模运算以适应题目中的数据范围限制。
摘要由CSDN通过智能技术生成

题目描述:

有N级台阶,你一开始在底部,每次可以向上迈 $1\sim K$ 级台阶,问到达第 $N$ 级台阶有多少种不同方式。

输入格式:

两个正整数N,K。

输出格式:

一个正整数ans(mod100003),为到达第N级台阶的不同方式数。

样例 #1

样例输入 #1

5 2

样例输出 #1

8

提示:

- 对于20%的数据,1≤N≤10,1≤K≤3;
- 对于40%的数据,1≤N≤1000;
- 对于100%的数据,1≤n≤100000,1≤K≤100。


 分析:

这题有两个做法,先说第一种吧。

方法一:

k=112358132134
k=2124713244481
k=31248152956108
k=31248163161120

这是作者举得几个例子,有人肯能发现了前k项是一个等比数列,比值是2。

当n<=k时,第n项=(2*前一项)%100003

那n>k时呢?

当n>k时,第n项=(上一项*2-第i-1-k项)%100003

那第一种的代码就有了:

#include <bits/stdc++.h>
using namespace std;
const int mod=100003;
int a[100010];
int main()
{
	int n,k;
	cin>>n>>k;
	a[0]=a[1]=1;//初始化
	for(int i=2;i<=n;i++)
	{
		if(i<=k)
		{
			a[i]=(a[i-1]*2)%mod;//取模!!
		}
		else
		{
			a[i]=((a[i-1]*2)-a[i-k-1])%mod;
		}//按规律写就好了
	}
	cout<<(a[n]+100003)%mod;//这里再取模是为了防止负数
    return 0;
}

Tips:

取模!!

方法二:

这个方法其实是dp动态规划,但他于普通的动态规划不同,在这里dp[i]代表第i阶的走法,那差不多就能写了,别忘了取模!!

#include <bits/stdc++.h>
using namespace std;
int dp[100010];
const int mod=100003;
int main()
{
	int n,k;
	cin>>n>>k;
	dp[0]=dp[1]=1;//初始化也别忘
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			if(i>=j)
			{
				dp[i]=(dp[i]+dp[i-j])%mod;
			}
		}
	}//动态规划模板
	cout<<dp[n]%mod;//防止负数
    return 0;
}

其实我个人推荐第一种,因为那是真的简单,不管你会哪种方法,都希望对你有帮助!

验证方式:洛谷P1192 台阶问题直接交就能AC

有问题的话可以在评论区讨论!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值