台阶问题
题目描述
有 N N N 级台阶,你一开始在底部,每次可以向上迈 1 ∼ K 1\sim K 1∼K 级台阶,问到达第 N N N 级台阶有多少种不同方式。
输入格式
两个正整数 N , K N,K N,K。
输出格式
一个正整数 a n s ( m o d 100003 ) ans\pmod{100003} ans(mod100003),为到达第 N N N 级台阶的不同方式数。
样例 #1
样例输入 #1
5 2
样例输出 #1
8
提示
- 对于 20 % 20\% 20% 的数据, 1 ≤ N ≤ 10 1\leq N\leq10 1≤N≤10, 1 ≤ K ≤ 3 1\leq K\leq3 1≤K≤3;
- 对于 40 % 40\% 40% 的数据, 1 ≤ N ≤ 1000 1\leq N\leq1000 1≤N≤1000;
- 对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 100000 1\leq N\leq100000 1≤N≤100000, 1 ≤ K ≤ 100 1\leq K\leq100 1≤K≤100。
思路
使用双重循环来遍历所有的状态。外层循环变量 i 表示当前的台阶数,内层循环变量 j 表示每次可以上的最大台阶数。
状态转移方程为:dp[i] = dp[i] + dp[i - j]
注意:
- 阶梯数不可能为负数
- 在每次累加之后立即进行取模操作
AC代码
#include <iostream>
#define ll long long
#define AUTHOR "HEX9CF"
using namespace std;
const int N = 1e5 + 5;
const int M = 100003;
int n, k;
ll dp[N];
int main()
{
dp[0] = 1;
cin >> n >> k;
for (int i = 0; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (i >= j)
{
dp[i] = (dp[i] + dp[i - j]) % M;
// cout << i << " " << j << endl;
}
}
}
cout << dp[n] << endl;
return 0;
}