台阶问题

题目描述

【洛谷 P1192】台阶问题 题解(动态规划)_#define 级台阶,你一开始在底部,每次可以向上迈 【洛谷 P1192】台阶问题 题解(动态规划)_#define_02 级台阶,问到达第 【洛谷 P1192】台阶问题 题解(动态规划)_#define 级台阶有多少种不同方式。

输入格式

两个正整数 【洛谷 P1192】台阶问题 题解(动态规划)_取模_04

输出格式

一个正整数 【洛谷 P1192】台阶问题 题解(动态规划)_取模_05,为到达第 【洛谷 P1192】台阶问题 题解(动态规划)_#define 级台阶的不同方式数。

样例 #1

样例输入 #1
5 2
  • 1.
样例输出 #1
8
  • 1.

提示

  • 对于 【洛谷 P1192】台阶问题 题解(动态规划)_取模_07 的数据,【洛谷 P1192】台阶问题 题解(动态规划)_#define_08【洛谷 P1192】台阶问题 题解(动态规划)_#define_09
  • 对于 【洛谷 P1192】台阶问题 题解(动态规划)_#define_10 的数据,【洛谷 P1192】台阶问题 题解(动态规划)_#define_11
  • 对于 【洛谷 P1192】台阶问题 题解(动态规划)_数据_12 的数据,【洛谷 P1192】台阶问题 题解(动态规划)_#define_13【洛谷 P1192】台阶问题 题解(动态规划)_#define_14

思路

使用双重循环来遍历所有的状态。外层循环变量 i 表示当前的台阶数,内层循环变量 j 表示每次可以上的最大台阶数。

状态转移方程为:dp[i] = dp[i] + dp[i - j]

注意:

  1. 阶梯数不可能为负数
  2. 在每次累加之后立即进行取模操作

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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.