代码随想录算法训练营第三十三天 | 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

devtools/2024/10/18 23:22:33/

一、动态规划理论基础

文章讲解:代码随想录 (programmercarl.com)——动态规划理论基础

视频讲解:从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门_哔哩哔哩_bilibili

题目分类:
1. 动态规划基础;
2. 背包问题;
3. 打家劫舍;
4. 股票问题;
5. 子序列问题。

动态规划五部曲:
1. 确定 dp[ i ] 数组及下标含义;
2. 确定递推公式;
3. 确定dp数组如何初始化;
4. 确定遍历顺序(背包问题中很重要);
5. 举例推导dp数组。

二、509. 斐波那契数

题目链接:509. 斐波那契数 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——509. 斐波那契数
视频讲解:手把手带你入门动态规划 | LeetCode:509.斐波那契数_哔哩哔哩_bilibili

动态规划五部曲:
1. 确定 dp[ i ] 数组及下标含义:dp[i]表示第i个斐波那契数值
2. 确定递推公式:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ]
3. 确定dp数组如何初始化:dp[ 0 ] = 0, dp[ 1 ] = 1
4. 确定遍历顺序:从前向后遍历
5. 举例推导dp数组。

class Solution:def fib(self, n: int) -> int:# 确定边界条件if n == 0 or n == 1:return n# 创建dp数组dp = [0] * (n + 1)# 初始化dp数组dp[0] = 0dp[1] = 1# 由前向后遍历for i in range(2, n + 1):# 确定递归公式dp[i] = dp[i - 1] + dp[i - 2]return dp[n]

三、70. 爬楼梯

题目链接:70. 爬楼梯 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——70. 爬楼梯
视频讲解:带你学透动态规划-爬楼梯(对应力扣70.爬楼梯)| 动态规划经典入门题目_哔哩哔哩_bilibili

分析:
1阶——1种
2阶——2种
3阶——1阶走一步 + 2阶走一步 = 3种
4阶——2阶走一步 + 3阶走一步 = 5种
类似斐波那契数列,只是初始值设置不同。

动态规划五部曲:
1. 确定 dp[ i ] 数组及下标含义:达到第i阶有dp[i]种方法。
2. 确定递推公式:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ]。
3. 确定dp数组如何初始化:dp[ 1 ] = 1, dp[ 2 ] = 2,dp[0]没有意义,题目要求为正整数。
4. 确定遍历顺序:从前向后遍历
5. 举例推导dp数组。

class Solution:def climbStairs(self, n: int) -> int:if n == 1:return 1dp = [0] * (n + 1)dp[1] = 1dp[2] = 2for i in range(3, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]

四、746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——746. 使用最小花费爬楼梯
视频讲解:动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯_哔哩哔哩_bilibili

动态规划五部曲:
1. 确定 dp[ i ] 数组及下标含义:到达 i 位置所需要的花费为 dp[ i ]。
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数组。

class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:dp = [0] * (len(cost) + 1)# 初始化dp[0] = 0dp[1] = 0for i in range(2, len(cost) + 1):# 确定递推公式,为前一步和前两步中花费最少的# 每一步花费为 dp[i - 1] 加上当前的花费 cost[i - 1]dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])return dp[len(cost)]

http://www.ppmy.cn/devtools/88260.html

相关文章

Windows 安装Redis7.4版本图文教程

本章教程,主要介绍如何在Windows上安装Redis7.4版本的Redis,并以服务方式实现开机自启动。 1、下载安装包 通过百度网盘分享的文件:Redis-7.4.0-Windows-x64-cygwin-with-Service.zip 链接:https://pan.baidu.com/s/1NFGXrCwumDzl…

如何强化学习神经网络

强化学习(Reinforcement Learning, RL)神经网络是一种通过奖励和惩罚机制来学习策略的方法,适用于各种复杂的决策问题。以下是强化学习神经网络的一些主要步骤和方法: 1. 了解基本概念 环境(Environment)…

MySQL 存储引擎

一,存储引擎概述 1:什么是存储引擎 存储引擎是数据库管理系统中负责数据存储和检索的部分。在关系型数据库系统中,存储引擎定义了数据如何被物理地存储、索引以及如何执行事务。不同的存储引擎提供不同的功能集,例如支持事务处理…

XMLDecoder反序列化

XMLDecoder反序列化 基础知识 就简单讲讲吧,就是为了解析xml内容的 一般我们的xml都是标签属性这样的写法 比如person对象以xml的形式存储在文件中 在decode反序列化方法后,控制台成功打印出反序列化的对象。 就是可以根据我们的标签识别是什么成分…

2024.7.24 作业

1.二叉树的创建、遍历自己实现一遍 bitree.h #ifndef BITREE_H #define BITREE_H#include <myhead.h>typedef char datatype;typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child; }Node,*BiTreePtr;//创建二叉树 BiTreePtr tree_cr…

网站后端管理和构建java项目的工具-Maven

maven是用于管理和构建java项目的工具。 管理Jar包 无论是使用eclipse、IDEA创建的maven项目&#xff0c;格式都是统一的。 不同开发工具创建的maven项目兼容。 test是对main测试的代码。main中的resources中放置配置文件。 对于Maven&#xff0c;一个Maven项目就是一个对象…

git 推送时出现错误 Locking support detected on remote “origin“

背景&#xff1a;代码托管是局域网搭建的gitlab 按照提示配置 lfs.locksverify true 还是没有用。 网上搜索了一番&#xff0c;其中有人提到可能时服务器磁盘满了&#xff0c;连到服务器上 df -h 查看&#xff0c; 发现根目录已经写满了&#xff1a; 使用命令行&#xff1a; d…

基础算法:离散化(C++实现)

文章目录 1. 离散化的定义2. 离散化例题2.1 离散化二分2.2 离散化哈希表 1. 离散化的定义 离散化是一种在程序设计和算法优化中常用的技术&#xff0c;其核心思想是将无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。具体来说&#xff0c;离散化…