台阶问题 — (递推式/动态规划)
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 }

浙公网安备 33010602011771号