上楼梯
2016-05-17 19:54
295 查看
题目
有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。
解答
a[i]=((a[i-1]+a[i-2])%1000000007+a[i-3])%1000000007的解释:
取模运算有这样一个性质:(a+b)%c = ((a%c)+(b%c))%c
所以(a[i-1]+a[i-2])%1000000007就相当于(a[i-1]%X+a[i-2]%X)%X 用X代替1000000007
这样就使得a[i-1]、a[i-2]、a[i-1]+a[i-2]都没有溢出,之后再与a[i-3]相加之后取模,使得全部结果没有溢出。
class GoUpstairs { public: int countWays(int n) { // write code here vector<int> memo(n+1,-1); return countWays(n,memo); } int countWays(int n,vector<int>& memo) { if(n < 0) return 0; else if(n == 0) return 1; else if(memo > -1) return memo ; else memo = ((countWays(n-1,memo)+countWays(n-2,memo))%1000000007+ countWays(n-3,memo))%1000000007; return memo ; } };
class GoUpstairs { public: int countWays(int n) { // write code here if(n == 1) return 1; else if(n == 2) return 2; else if(n ==3) return 4; vector<int> dp(n+1,0); dp[1] = 1; dp[2] = 2; dp[3] = 4; for(int i = 4;i<=n;++i) dp[i] = ((dp[i-1] + dp[i-2])%1000000007+ dp[i-3])%1000000007; return dp ; } };
class GoUpstairs { public: int countWays(int n) { // write code here if(n < 0) return 0; else if(n == 0) return 1; int minus1 = 1; int minus2 = 0; int minus3 = 0; int cur = 0; for(int i = 1;i<=n;++i) { cur = ((minus1 + minus2)%1000000007 + minus3)%1000000007; minus3 = minus2; minus2 = minus1; minus1 = cur; } return cur; } };
相关文章推荐
- SICP 2-31 2-32 SymbolicDiffer
- python学习笔记,长期记录不会的知识
- win10 explorer导致闪屏的解决方案
- [bzoj 1617]: [Usaco2008 Mar]River Crossing渡河问题 dp
- 乘法逆元与费马小定理
- [BZOJ1002][FJOI2007]轮状病毒(打表找规律+高精度||结论)
- 【bzoj1618】【Usaco2008 Nov]】Buying Hay 购买干草
- RIP、OSPF、BGP三种协议
- Ubuntu下Chrome造成系统假死的解决方法
- Docker 学习日志 (二)
- BZOJ -1864: [Zjoi2006]三色二叉树
- 算是学完了《Servlet&JSP学习笔记》,立此存照
- IOS学习之初识KVO
- SQL索引一步到位
- git命令每次提交都要输入用户名和密码的解决办法(git push origin master)
- 2016SDAU编程练习三1018
- 数据库学习之旅——实验3(1)
- MapReduce应用实例
- 自己想做的
- 系统优化