算法学习【动态规划】(1)


斐波那契数列

class Solution {
public:
    int fib(int n) {
        if(n<=1) return n;
        vector<int> dp(n+1);
        dp[0] = 0;
        dp[1] = 1;
        for(int i=2;i<=n;i++)&#123;
            dp[i]=dp[i-1]+dp[i-2];
        &#125;
        return dp[n];

    &#125;
&#125;;

爬楼梯

class Solution {
public:
    int climbStairs(int n) {
        if(n<=1) return n;
        int dp[3];
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<=n;i++){
            int sum =dp[1]+dp[2];
            dp[1] = dp[2];
            dp[2] = sum;
        }
        return dp[2];

    }
};

拓展到m个楼梯

class Solution &#123;
public:
    int climbStairs(int n) &#123;
        vector<int> dp(n + 1, 0);
        dp[0] = 1;
        for (int i = 1; i <= n; i++) &#123;
            for (int j = 1; j <= m; j++) &#123; // 把m换成2,就可以AC爬楼梯这道题
                if (i - j >= 0) dp[i] += dp[i - j];
            &#125;
        &#125;
        return dp[n];
    &#125;
&#125;;

使用最小花费爬楼梯

class Solution &#123;
public:
    int minCostClimbingStairs(vector<int>& cost) &#123;
        vector<int> dp(cost.size());
        dp[0] = cost[0];
        dp[1] = cost[1];
        for (int i = 2; i < cost.size(); i++) &#123;
            dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
        &#125;
        // 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值
        return min(dp[cost.size() - 1], dp[cost.size() - 2]);
    &#125;
&#125;;

文章作者: Turboost Chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Turboost Chen !
  目录