P1192 台阶问题————C++

2024-01-07 17:33:20

台阶问题

题目描述

N N N 级台阶,你一开始在底部,每次可以向上迈 1 ~ K 1\sim K 1K 级台阶,问到达第 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 1N10 1 ≤ K ≤ 3 1\leq K\leq3 1K3
  • 对于 40 % 40\% 40% 的数据, 1 ≤ N ≤ 1000 1\leq N\leq1000 1N1000
  • 对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 100000 1\leq N\leq100000 1N100000 1 ≤ K ≤ 100 1\leq K\leq100 1K100

解题思路

  • 动态规划。
  • 状态转移方程:dp[i] = dp[i] + dp[i - j];i表示当前的台阶数,j表示每次可以达到的最大台阶数。
  • 状态初始化:dp[0] = 1。

Code

#include<iostream>
#include <vector>

using namespace std;

int num = 100003;
int n, k;
vector<int> dp(100000); // 定义数组

int main() {
	cin >> n >> k;  // 输入数据
	dp[0] = 1;
	for (int i = 0; i <= n; i++) {
		for (int j = 1; j <= k; j++) {
			if (i >= j) {
				dp[i] = (dp[i] + dp[i - j]) % num;
			}
		}
	}
	cout << dp[n] << endl;
	return 0;
}

运行结果

文章来源:https://blog.csdn.net/Kinght_123/article/details/135386777
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。