代码随想录算法训练营第三十二天|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)以及下标的含义

dp[i]表示第i项斐波那契数列

2.确定递推公式

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

3.dp数组如何初始化

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

即dp[0] = 0,dp[1] = 1;

4.确定遍历顺序

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

5.举例推导dp数组

dp[2]、dp[3]符合,递推到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)以及下标的含义

dp[i]表示第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台阶方案数

即,dp[i] = dp[i-1] + dp[i-2]

3.dp数组如何初始化

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

即dp[1] = 1,dp[2] = 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)以及下标的含义

dp[i]表示到达第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)阶跳的费用)。

整体看感觉思路可行:即,dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])。

3.dp数组如何初始化

第0阶和第1阶的为起点,不需要花费价钱,故dp[0] = 0, dp[1] = 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];
    }
};
相关推荐
xiaoshiguang31 小时前
LeetCode:77. 组合
java·算法·leetcode
Ning_.5 小时前
LeetCode 第367题:有效的完全平方数
算法·leetcode·职场和发展
今天吃饺子7 小时前
小创新模型!6种2024算法优化BiTCN-SVM单变量输入单步预测,MATLAB机器学习预测全家桶再更新...
人工智能·算法·机器学习·支持向量机·matlab
廖显东-ShirDon 讲编程7 小时前
《零基础Go语言算法实战》【题目 2-5】函数参数的值传递和引用传递
算法·程序员·go语言·web编程·go web
不玩return的马可乐7 小时前
LeetCode 747. 至少是其他数字两倍的最大数
数据结构·c++·程序人生·算法·leetcode
怎么名字都重复8 小时前
1.两数之和--力扣
java·数据结构·算法·leetcode·软件工程
Odaily_8 小时前
SVM赛道概览:MoveVM落地,SVM能走多远
人工智能·算法·机器学习·支持向量机·数据挖掘
深图智能9 小时前
OpenCV的一种改进型的素描特效算法
图像处理·opencv·算法·计算机视觉
Mr.W.T9 小时前
负载均衡原理及算法
算法·负载均衡