洛谷Oj-台阶问题-递推

版权声明:欢迎转载 https://blog.csdn.net/suntengnb/article/details/72974491

问题描述
有N级的台阶,你一开始在底部(第0级),每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。
问题分析
让我们来看看当k等于2时的情形,
N=1:根据显然定理,只有1种走法
N=2:可以每次走1步,走2次,也可以一次走2步,有2种走法
N=3:1,1,1;1,2;2,1;有3种走法
N=4:1,1,1,1;1,1,2;1,2,1;2,1,1;2,2;有5种走法
N=5:1,1,1,1,1;1,1,1,2;1,1,2,1;1,2,1,1;2,1,1,1;1,2,2;2,1,2;2,2,1;有8种走法
1,2,3,5,8是不是感到很熟悉呢,这就是斐波那契数列的第2到6项啊。
递推公式:
F(N)=1,N=0或1;F(N)=F(N-1)+F(N-2);
这道题目就是斐波那契数列的变形,以上是K等于2时的递推公式,我们很容易类比,归纳出当K的值不确定时候的递推公式:
F(N)=1,N=0;F(N)=F(N-1)+F(N-2)+······+F(N-K)。注意N-K不能小于0
另外,要想写出递推公式,还是需要一定量的数据做基础的
AC代码

int a[1000001]={1};//a[i]记录到达第N级台阶的方法数,将a[0]赋为1
int main()
{
    int n,k,i,j;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        for(j=1;j<=k;j++)
            if(i>=j)//防止N-K小于0
                a[i]=(a[i]+a[i-j])%100003;//每计算一次a[i]就要mod一次100003(题目要求)
    printf("%d\n",a[n]);
    return 0;
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页