题目描述:
有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。
输入输出格式
输入格式:
两个正整数N,K。
输出格式:
一个正整数,为不同方式数,由于答案可能很大,你需要输出ans mod 100003后的结果。
思路:
一开始想用深搜来做,每次从1到k步的循环内递归调用函数,当步数和等于n时,总数加1,然后返回,但是只过了第一个测试点,其他的四千多毫秒。用递推,可以想到,如果到第n个台阶,那么可以先到第n-i(i在1和k之间)个台阶,然后在一步到达这个台阶,即n-i的任意一个台阶都可以一步到达第n个台阶。在一个地方卡了好久,就是j从1到k的遍历中,要保证i-j大于等于0才可以。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int a[100005];
int main()
{
int n, k;
cin>>n>>k;
a[0]=1;
for (int i=1; i<=n; i++){
for (int j=1; j<=k&&(i-j)>=0; j++){
a[i]=(a[i]+a[i-j])%100003;
}
}
printf("%d", a[n]);
return 0;
}