【洛谷 P1192】台阶问题 题解(动态规划)

台阶问题

题目描述

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

思路

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

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

注意:

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

AC代码

#include 
#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;
}

你可能感兴趣的:(数据结构与算法,动态规划,算法,c++)