代码随想录算法训练营第三十二天|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];
    }
};
相关推荐
zzz_236813 分钟前
【Java实习面试算法冲刺】图论
java·算法·面试
大鱼>21 分钟前
宠物监控数据安全与隐私保护:端到端加密与合规实践
人工智能·深度学习·算法·iot·宠物
被自己蠢哭27 分钟前
BFS广度优先搜索问题:#P00496. 华为od机试—自动泊车
算法
:-)28 分钟前
分支限界算法
算法
大鱼>1 小时前
宠物行为识别AI算法详解:从数据采集到模型部署的完整方案
人工智能·深度学习·算法·宠物
王莎莎-MinerU1 小时前
解析回归集:RAG 和 Agent 上线前,先把表格、公式、版面测清楚
人工智能·算法·数据挖掘·回归·pdf·ocr
KaMeidebaby1 小时前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
AndrewHZ1 小时前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
AI科技星2 小时前
基于全域数学公理体系求解三元约束极值题【乖乖数学】
人工智能·算法·机器学习·密码学·拓扑学·乖乖数学·全域数学
伊玛目的门徒10 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode