代码随想录算法训练营第三十二天|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];
    }
};
相关推荐
Dillon Dong2 小时前
【风电控制】TI TMS320F28379D 双CPU架构解析与任务分布设计
嵌入式硬件·算法·变流器·风电控制
小羊在睡觉8 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary8 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记8 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466858 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
_日拱一卒9 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM9 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro10 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
voidmort10 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
人道领域11 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法