代码随想录算法训练营第三十二天|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];
    }
};
相关推荐
AI备案指南-满满2 小时前
人工智能拟人化互动服务安全自评估报告的评估要点有哪些?
人工智能·算法·安全·机器人·大模型备案·算法备案
土司大王4 小时前
LeetCode hot100——两两交换链表中的节点
算法·leetcode·职场和发展
大熊背5 小时前
树莓派IspPipeline LSC模块原理详解
算法·lsc·isppipeline·mesh lsc
zander2585 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
祖力556 小时前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
名字还没想好☜6 小时前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
地平线开发者6 小时前
【模型轻量化专题】深度学习模型为什么需要轻量化
算法
_Narcissus_7 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
Lyyaoo.7 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
threerocks7 小时前
《The AI-Native SDLC Playbook》万字拆解
算法·aigc·ai编程