天天看點

三步問題

#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(){

}
           

繼續閱讀