台阶问题 — (递推式/动态规划)

1.题目

P1192 台阶问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一本通视频题解——1190:上台阶_哔哩哔哩_bilibili

 

2.重点

  1.n是台阶数,m是最多走几阶台阶,可以只按最后一步的情况分类,走1,2,3,....m 步到终点分为m种

  a[i] = a[i - 1] + a[i - 2] +........+a[i - m]

  a[i+1] = a[i] + a[i - 1] +...+a[i - 1 - m]    =>   a[i+1] = 2*a[i] - a[i - m]    =>  a[i] = 2*a[i - 1] - a[i - 1 - m]

  如果i <= m台阶数小于最多走台阶数 a[i] = 2*a[i - 1];

  如果i > m时a[i] = 2*a[i - 1] - a[i - 1 - m] ;

 

3.题解

 1 # include <iostream>
 2 
 3 using namespace std;
 4 typedef long long ll;
 5 int n,m;
 6 const int  mod = 100003;
 7 ll a[1000010];
 8 int main()
 9 {
10     cin >> n >> m;//n为台阶数,m为最多走几级台阶 
11     a[0] = a[1] = 1;
12     for(int i = 2; i <= n; i++)
13     {
14         //台阶数小于最多走的台阶数 
15         if(i <= m) a[i] = 2*a[i-1] % mod;
16         else a[i] = 2*a[i - 1] - a[i - 1 - m];
17         a[i] %= mod;
18     }
19     cout << (a[n] + mod) % mod <<  endl;
20     
21     return 0;
22 }
View Code

 

posted @ 2023-01-16 12:48  羽球帝  阅读(85)  评论(0)    收藏  举报