理论基础

动态规划基础

动态规划五部曲

  • dp数组及下标的含义
  • 递推公式
  • dp数组如何初始化
  • 遍历顺序
  • 打印dp数组

背包问题

打家劫舍

股票问题

子序列问题

刷题笔记day38

509.斐波那契数

文章讲解:代码随想录
是否自己做出来通过全部用例:是

遇到的困难/犯的错误

自己写的代码

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

看了题解后的收获

用动规代替递归可以降低时间复杂度。

70.爬楼梯

文章讲解:代码随想录
是否自己做出来通过全部用例:是

遇到的困难/犯的错误

dp[0]其实没有意义。

自己写的代码

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n;
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

看了题解后的收获

斐波那契数的应用。

746.使用最小花费爬楼梯

文章讲解:代码随想录
是否自己做出来通过全部用例:是

遇到的困难/犯的错误

这里直接递推,一层循环就可以,不用两层循环。

自己写的代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size()+1, 0);
        dp[0] = 0;
        dp[1] = 0;
        for (int j = 2; j <= cost.size(); j++) {
            dp[j] = min(dp[j-1]+cost[j-1],dp[j-2]+cost[j-2]);
        }
        return dp[cost.size()];
    }
};

看了题解后的收获

动规五部曲。