P1192 台阶问题
1.问题
见题目
2.分析
- 具有子问题特性,需分治(递归)解决
- 类似Fibonacci数列问题
- 建立适当的递推式即可
- 需要在适当的地方运用数论的知识 [(a+b) mod n =((a mod n)+(b mod n)) mod n ]
3.代码
#include<iostream> using namespace std; const int maxN = 100005; typedef long long ll; int k ; ll f[maxN]; //n级台阶需要迈的次数 int cal(int n){ if(n==1 || n==0) return f[n]; //可以选择迈1-k步 //注意i的取值范围,这个很关键 for(int i = 1;i<=k && i<=n;i++){ if(f[n-i]!=0) f[n] += f[n-i]; else f[n] = f[n] + cal(n-i); f[n] = f[n] % 100003; } return f[n]; } int main(){ int n; cin >> n>> k; fill(f,f+maxN,0); f[0] = f[1] = 1; cal(n); cout << f[n] % 100003; }