您的位置:首页 > 其它

上楼梯

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;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: