Loading

【算法训练营day38】动态规划理论基础 LeetCode509. 斐波那契数 LeetCode70. 爬楼梯 LeetCode746. 使用最小花费爬楼梯

动态规划理论基础

动态规划的解题步骤。

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

LeetCode509. 斐波那契数

题目链接:509. 斐波那契数

独上高楼,望尽天涯路

刚接触动态规划,学习为主,直接看题解视频。

慕然回首,灯火阑珊处

简单的动态规划题目,dp[i]表示的是第i项斐波那契数的值,递推公式和dp数组如何初始化已经给出,遍历顺序从前向后。

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

LeetCode70. 爬楼梯

题目链接:70. 爬楼梯

独上高楼,望尽天涯路

思路对了,慢慢找到感觉了。

慕然回首,灯火阑珊处

dp[i]表示的是上到爬到第i阶台阶的方法数,需要注意的是应该从dp[1]开始初始化,dp[0]本身没有实际意义。

class Solution {
public:
    int climbStairs(int n) {
        if (n < 2) return 1;
        vector<int> dp(n + 1);
        dp[1] = 1; // 不应该从dp[0]开始初始化,dp[0]本身没有实际意义。
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

LeetCode746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯

独上高楼,望尽天涯路

有感觉了,dp[i]表示的是上到爬到第i阶台阶的最小花费。

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

慕然回首,灯火阑珊处

思路一样。

posted @ 2023-02-03 14:55  BarcelonaTong  阅读(22)  评论(0)    收藏  举报