【动态规划】三步问题

题目描述:【动态规划】三步问题_第1张图片

示例:

【动态规划】三步问题_第2张图片

(1)题目解析:

小孩每一次可以走1,2,3步,那么形成不同的排列组合,会有很多种上楼梯方式。


(2)算法原理:

[1]状态表示

根据题目要求+经验,建立一个dp表,dp表中每个值,表示到达i位置为止,上楼梯的方式总数。


[2]状态转移方程 

【动态规划】三步问题_第3张图片

注意:计算的是方案数而不是步数,因此在选择从i-1=>i  i-2=>i  i-3=>i的时候,方案数和i-1位置 i-2位置 i-3位置相同,不需要+1。

状态转移方程:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

[3]初始化
由于dp[i]位置的值是由前三个位置的值推到出来的,因此第0,1,2位置的值应该进行初始化,以防越界。

[4]填表顺序 
只有前面三个位置的值知道了才能算出 i 位置的值,因此是从左往右。

[5]返回值
最后返回所需值dp[n]。

(3)代码实现
 

class Solution {
public:
    int waysToStep(int n) 
    {
        const int MAX=1e9+7;
        //边界位置情况
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        if(n==4)
            return 4;
        vector dp(n+1);
        dp[1]=1;
        dp[2]=2;
        dp[3]=4;
        int i=0;
        for(i=4;i<=n;i++)
        {
            dp[i]=((dp[i-1]+dp[i-2])%MAX+dp[i-3])%MAX;
            //为防止越界,每次进行加法运算取一次模
        }
        return dp[n];
    }
};

你可能感兴趣的:(动态规划,动态规划,算法)