zoukankan      html  css  js  c++  java
  • 面试题 08.01. 三步问题

    面试题 08.01. 三步问题

    三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

    示例1:

    输入:n = 3
    输出:4
    说明: 有四种走法
    示例2:

    输入:n = 5
    输出:13
    提示:

    n范围在[1, 1000000]之间

     为什么可以在过程中取模而不影响最终结果

    状态转移方程不用说了:S(n) = S(n-1)+S(n-2)+S(n-3)
    因为要对结果S(n)取模,用S(n)'代S(n)取模的结果,即 if S(n) > 1000000007: S(n)'= S(n) - n*1000000007
    于是如果对S(n+1)取模有:S(n+1) = S(n) + S(n-1) + S(n-2) = S(n)' + n*1000000007 + S(n-1) + S(n-2)
     那么S(n+1) % 1000000007 =( S(n)' + n*1000000007 + S(n-1) + S(n-2))%1000000007=   ( S(n)' + S(n-1) + S(n-2) ) % 1000000007,同理 S(n-1),S(n-2), 等于他们的取模和。
    即:S(n+1) % 1000000007 =  ( S(n)' + S(n-1) ' + S(n-2) ' ) % 1000000007
     1  class Solution {
     2 public:
     3     int waysToStep(int n) {
     4         vector<long long> dp(n,0);
     5         if(n==0) return 0;
     6         else if(n==1) return 1;
     7         else if(n==2) return 2;
     8         else if(n==3) return 4;
     9         dp[0]=1;
    10         dp[1]=2;
    11         dp[2]=4;//1(到达一级楼梯的方法+一下两步到达三阶)+2(到达2阶楼梯的方法+一步到达三阶)+1(一下三步)
    12         for(int i=3;i<n;i++){
    13             dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;//中途可能数字越界
    14         }
    15         return dp[n-1];//dp[n-1]%1000000007;
    16     }
    17 };
  • 相关阅读:
    BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
    SPOJ QTree【树链剖分】
    BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
    Hibernate学习实例
    Educational Codeforces Round 64 C. Match Points 【二分思想】
    ramn 备份操作
    表值函数--自定义工作日历
    删除win10开始菜单中程序的目录
    C#自定义注释自动生成模板注释
    oralce知识第三章
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/12694378.html
Copyright © 2011-2022 走看看