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