面试题 08.01. 三步问题

Posted niroberteinteson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 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 };

 

以上是关于面试题 08.01. 三步问题的主要内容,如果未能解决你的问题,请参考以下文章

面试题 08.01. 三步问题DP水题

程序员面试金典-面试题 08.01. 三步问题

leetcode 面试题 08.01. 三步问题

《程序员面试金典(第6版)》面试题 08.01. 三步问题(动态规划,c++)

前端面试题之手写promise

Java工程师面试题,二级java刷题软件