#include <iostream>
#include <vector>
using namespace std;
/*
題目描述:三步問題。有個小孩正在上樓梯,樓梯有n階台階,
小孩一次可以上1階、2階或3階。實作一種方法,計算小孩有多少種上樓梯的方式。
結果可能很大,你需要對結果模1000000007。
思考:
自底向上動态規劃。memo[i]=memo[i-1]+memo[i-2]+memo[i-3]。
memo[1]=1,memo[2]=2,memo[3]=4;
*/
/*取模,對兩個較大的數之和取模再對整體取模,防止越界
假如對三個dp[i-n]都 % 1000000007,那麼也是會出現越界情況(導緻溢出變為負數的問題)
因為如果本來三個dp[i-n]都接近 1000000007 那麼取模後仍然不變,但三個相加則溢出
但對兩個較大的dp[i-n]:dp[i-2],dp[i-3]之和mod 1000000007,
那麼這兩個較大的數相加大于 1000000007但又不溢出
取模後變成一個很小的數,與dp[i-1]相加也不溢出
*/
class Solution {
public:
int waysToStep(int n) {
vector<int> memo(n+1,0);
memo[1]=1,memo[2]=2,memo[3]=4;
for(int i=4;i<=n;i++){
memo[i]=(memo[i-1]+memo[i-2]) % 1000000007+memo[i-3];
memo[i]%= 1000000007;
}
return memo[n];
}
};
int main(){
}