台阶问题 解题报告

题目描述

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

输入输出格式

输入格式:

两个正整数N,K。

输出格式:

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

输入输出样例

输入样例#1: 复制

5 2

输出样例#1: 复制

8

说明

对于20%的数据,有N≤10,K≤3 ;

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

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

简单的递推。

设当前在第i级台阶,a[i]为走到第i级台阶的方案数,因为i只能从i-k,i-k+1,i-k+2,……,i-1走到,故a[i]=a[i-k]+a[i-k+1]+……+a[i-1],即:

a[i]=\sum_{j=max(i-k,0)}^{i-1}a[j]

(注意下限不得小于0)。

初始在0级台阶,故a[0]=1。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
    int a[100001];
    int n,k;
int main()
{
    a[0]=1;
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=min(i,k);j++)
        {
            a[i]+=a[i-j];
            a[i]%=100003;
        }
    printf("%d",a[n]);
}

猜你喜欢

转载自blog.csdn.net/weixin_39872717/article/details/81077960
今日推荐