Java 动态规划 Licode面试题 08.01. 三步问题

 代码展示:

class Solution {
    int mod=(int)1e9+7;
    public int waysToStep(int n) {
        //特殊情况处理
        if(n==1||n==2){
            return n;
        }
        if(n==3){
            return 4;
        }
        //定义dp数组
        int[]dp=new int[n+1];
        //初始化
        dp[1]=1;dp[2]=2;dp[3]=4;

        for(int i=4;i<=n;i++){
            dp[i]=((dp[i-1]+dp[i-2])%mod+dp[i-3])%mod;
        }

        return dp[n];
    }
}

        分析:

        1.要采用动态规划的方法,首先就要分析该题目状态的表示

        我先列出1-5阶台阶的方式数,再来解释其中的规律

台阶数:1 2 3 4 5

方式数:1 2 4 7 13

        当台阶数为1时,小孩可以直接上1阶,就1种方式

         当台阶数为2时,小孩可以直接上2阶,也可以上到第1阶台阶再上第2阶台阶,而上到第1阶台阶的方式有1种,所以加起来有2种方式

        当台阶数为3时,小孩可以直接上3阶,也可以上到第1阶台阶再上到第3阶台阶,而上到第1阶台阶的方式有1种,还可以上到第2阶台阶再上到第3阶台阶,而上到第2阶台阶的方式有2种,所以加起来有1+1+2=4种方式

        当台阶数为4时,小孩不能直接上到4阶,但可以上到第1阶台阶再上到第4阶台阶,而上到第1阶台阶的方式有1种,还可以上到第2阶台阶再上到第4阶台阶,而上到第2阶台阶的方式有2种,还可以上到第3阶台阶再上到第4阶台阶,而上到第3阶台阶的方式有4种所以加起来有1+2+4=7种方式

        当台阶数为5时,小孩不能直接上到5阶,但可以上到第2阶台阶再上到第5阶台阶,而上到第2阶台阶的方式有2种,还可以上到第3阶台阶再上到第5阶台阶,而上到第3阶台阶的方式有4种,还可以上到第4阶台阶再上到第5阶台阶,而上到第4阶台阶的方式有7种所以加起来有2+4+7=13种方式

        我们推算到这里便已经发现规律了,当台阶数为4时,方式数为台阶数为3,2,1方式数的总和,当台阶数为5时,方式数为台阶数为4,3,2方式数的总和

       2. 所以我们可以得到动态规划的状态转移方程为dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

       3.创建dp数组,进行初始化(根据分析,在i>3时才能用该状态转移方程,所以初始化dp[1],dp[2],dp[3])

       4.根据状态转移方程从左到右依次填充dp数组

        5.返回dp[n]的值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值