码迷,mamicode.com
首页 > 其他好文 > 详细

面试题 08.01. 三步问题

时间:2020-04-13 22:21:15      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:试题   示例   code   vector   solution   str   需要   cto   之间   

面试题 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. 三步问题

标签:试题   示例   code   vector   solution   str   需要   cto   之间   

原文地址:https://www.cnblogs.com/NirobertEinteson/p/12694378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!