P1192 台阶问题

题目描述

N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。

输入格式

两个正整数N,K。

输出格式

一个正整数,为不同方式数,由于答案可能很大,你需要输出ansmod100003后的结果。

输入输出样例

输入 #1
5 2
输出 #1
8

说明/提示

对于20%的数据,有N10,K3;

对于40%的数据,有N≤1000;

对于100%的数据,有N≤100000,K≤100;

 

我是区分了k之前和k之后的方法数:

k之前:f[n]=f[1]+...+f[n-1]+1;

k之后: f[n]=f[1]+...+f[n-1];

你们可以自行验证,代码也有解释。

 

 1 #include<iostream> 
 2 using namespace std;
 3 int f[1000001];
 4 int main(){
 5   int n,k;
 6  cin>>n>>k;
 7  f[1]=1;
 8  //记录k之前的各方法数; 
 9     for(int i=2;i<=k;i++){
10      for(int j=1;j<i;j++){
11       f[i]+=f[j];
12   } 
13   f[i]+=1;//当小于k时,各方法数等于f[n]=f[1]+...+f[n-1]+1  其中最后1为新增的,直接一步到终点; 
14   f[i]=f[i]%100003;//注意取模 
15  }
16  //当n大于k时,f[n]=f[1]+...+f[n-1]; 
17   for(int j=k+1;j<=n;j++){
18    for(int i=1;i<=k;i++){
19    f[j]+=f[j-i];
20   }
21   f[j]=f[j]%100003;
22  }
23  cout<<f[n];
24  return 0;
25 }

 

本人小白,如有错误,欢迎指正,谢谢^~^。

posted @ 2019-08-04 09:48  诺启辰~  阅读(251)  评论(0)    收藏  举报