• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

面试题 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 };

 

posted @ 2020-04-13 22:11  Nirogo  阅读(328)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3