代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

目录

509.斐波那契数

动态规划五部曲:

[1.确定dp数组(dp table)以及下标的含义](#1.确定dp数组(dp table)以及下标的含义)

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推导dp数组

70.爬楼梯

动态规划五部曲:

[1.确定dp数组(dp table)以及下标的含义](#1.确定dp数组(dp table)以及下标的含义)

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推导dp数组

746.使用最小花费爬楼梯

动态规划五部曲:

[1.确定dp数组(dp table)以及下标的含义](#1.确定dp数组(dp table)以及下标的含义)

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推导dp数组


509.斐波那契数

题目链接:509. 斐波那契数 - 力扣(LeetCode)

动态规划五部曲:

1.确定dp数组(dp table)以及下标的含义

dpi表示第i项斐波那契数列

2.确定递推公式

第i项斐波那契数列 = 前两项之和,即dpi = dpi-1 + dpi-2;

3.dp数组如何初始化

递推公式的i = 0和i = 1不符合递推公式,且是最边界情况,特别处理,

即dp0 = 0,dp1 = 1;

4.确定遍历顺序

从第三个数据位置开始遍历

5.举例推导dp数组

dp2、dp3符合,递推到dp...都可行

cpp 复制代码
class Solution 
{
public:
    int fib(int n) 
    {
        vector<int> dp(n+10);
        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.爬楼梯

题目链接:70. 爬楼梯 - 力扣(LeetCode)

动态规划五部曲:

1.确定dp数组(dp table)以及下标的含义

dpi表示第i个台阶的方案数

2.确定递推公式

1阶:1

2阶:2

3阶:先走一步,如果一步走一阶,剩2阶,方案数为2,

如果一步走两阶,剩1阶方案数为1,方案数总共2+1 = 3

4阶:先走一步,如果一步走一阶,剩3阶,方案数为3,

如果一步走两阶,剩2阶方案数为2,方案数总共3+2 = 5

5阶:先走一步,如果一步走一阶,剩4阶,方案数为5,

如果一步走两阶,剩3阶方案数为3,方案数总共5+3 = 8

总结:当前台阶i的方案数 = i-1台阶方案数 +i-2台阶方案数

即,dpi = dpi-1 + dpi-2

3.dp数组如何初始化

递推公式的i = 1和i = 2不符合递推公式,且是最边界情况,特别处理,

即dp1 = 1,dp2 = 2;

4.确定遍历顺序

从第三个数据位置开始遍历

5.举例推导dp数组

第二步推到过了可行。

cpp 复制代码
class Solution {
public:
    int climbStairs(int n) 
    {
        vector<int> dp(n+10);
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3; i<=n; i++)
        {
            dp[i] = dp[i-1] + dp[i-2];	// i-1台阶的方案数 +i-2台阶的方案数 
        }   
        return dp[n];
    }
};

746.使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)

动态规划五部曲:

1.确定dp数组(dp table)以及下标的含义

dpi表示到达第i个台阶所花的最小费用

2.确定递推公式

0阶:0元。

1阶:0元。

2阶:min(到达(2-1)阶的费用+(2-1)阶跳的费用 , 到达(2-2)阶的费用 +(2-2)阶跳的费用)。

3阶:min(到达(3-1)阶的费用+(3-1)阶跳的费用 , 到达(3-2)阶的费用 +(3-2)阶跳的费用)。

4阶:min(到达(4-1)阶的费用+(4-1)阶跳的费用 , 到达(4-2)阶的费用 +(4-2)阶跳的费用)。

整体看感觉思路可行:即,dpi = min(dpi-1+costi-1, dpi-2+costi-2)。

3.dp数组如何初始化

第0阶和第1阶的为起点,不需要花费价钱,故dp0 = 0, dp1 = 0。

4.确定遍历顺序

从第三个数据位置开始遍历

5.举例推导dp数组

按预期,数据是从第0个台阶依次到第n个台阶(顶点)的变化,所以数据是递推过去的,担心min()可能取0的值,验证了i = 2的程序,和i = 3的清楚,数据按预测的递推过程进行变化,可行。

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        vector<int> dp(cost.size()+10);

        dp[0] = 0;
        dp[1] = 0;
        int n = cost.size();
        for(int i=2; i<=n; i++)
        {
            // i-1往上爬 或者i-2往上爬,取最小
            dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]); 
            // 通过这个输出+题目信息把"<n"改成了"<=n",了解到n-1是台阶,而不是到顶
            // cout<<dp[i]<<' '<<dp[i-1]+cost[i-1]<<' '<<dp[i-2]+cost[i-2]<<'\n';   
        }
        return dp[n];
    }
};
相关推荐
To_OC10 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与14 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络19 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络2 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4002 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4002 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2123 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法