代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC746.使用最小花费爬楼梯

server/2024/12/15 21:55:35/

动态规划理论基础

        解释:动态规划,英文:Dynamic Programming,简称DP;如果某一问题有很多重叠子问题,使用动态规划是最有效的。

动态规划五部曲:

        1、确定dp数组(dp table)以及下标的含义;

        2、确定递推公式;

        3、dp数组如何初始化;

        4、确定遍历顺序;

        5、举例推导dp数组;

        为什么要先确定递推公式,然后在考虑初始化呢?因为一些情况是递推公式决定了dp数组要如何初始化!

509. 斐波那契数 - 力扣(LeetCode)

 做动态规划的题目,严格按照五部曲走,分别对应5步,然后写出对应的代码;

①确定dp数组以及下标的含义:

        dp[i]的定义为:第i个数的斐波那契数值是dp[i]

②确定递推公式:

        文中已给:F(n) = F(n - 1) + F(n - 2)公式,则状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

③dp数组如何初始化;

        文中已给:F(0) = 0,F(1) = 1,则dp[0]=0,dp[1]=1;

④确定遍历顺序;

        dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的;

⑤举例推导dp数组;

        按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 13 21 34 55,如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的;

python">class Solution:def fib(self, n: int) -> int:# 首先排除边的情况if n == 0:return 0# 创建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]if __name__ == '__main__':n = 2res = Solution().fib(n)print(res)

70. 爬楼梯 - 力扣(LeetCode)

①确定dp数组以及下标的含义:

        dp[i]的定义为: 爬到第i层楼梯,有dp[i]种方法

②确定递推公式:

        自己手推dp[1]=1,dp[2]=2,dp[3]=3,dp[4]=5,则状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

③dp数组如何初始化;

         dp[0]是存在争议的,但是对于dp[1]=1,dp[2]=2是没有争议的,那就从i=3开始遍历;

④确定遍历顺序;

        dp[i] = dp[i - 1] + dp[i - 2],表示从前向后遍历

⑤举例推导dp数组;

        按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为5时,的时候,dp数组应该是如下的数列:1,2,3,5,8;

python">class Solution:def climbStairs(self, n: int) -> int:# 边缘判断if n <= 1:return n# 定义一个空数组dp = [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]if __name__ == '__main__':n = 5res = Solution().climbStairs(n)print(res)

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

①确定dp数组以及下标的含义:

        dp[i]的定义为:到达第i台阶所花费的最少体力为dp[i]。-

②确定递推公式:

        题目中解释到一旦你支付此费用,即可选择向上爬一个或者两个台阶。即可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]

        dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

        dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

        那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

③dp数组如何初始化;

         题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。

        所以初始化 dp[0] = 0,dp[1] = 0;(因为还没有开始爬,开始爬开需要消耗)

④确定遍历顺序;

        dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了

⑤举例推导dp数组;

        拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:

python">from typing import List
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数组dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])# 返回达到楼顶的最小花费return dp[len(cost)]if __name__ == '__main__':cost = [1,100,1,1,1,100,1,1,100,1]res = Solution().minCostClimbingStairs(cost)print(res)

http://www.ppmy.cn/server/150451.html

相关文章

linux下编程记录

** gcc ** 编写C源代码 首先&#xff0c;创建一个C源代码文件&#xff0c;例如 main.cpp&#xff0c;并编辑你的代码。比如&#xff1a; #include <iostream> using namespace std;int main() {cout << "Hello, World!" << endl;return 0;}使用…

HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装

TCP/IP协议栈的封装过程 用户从应用层发出数据先会交给传输层&#xff0c;传输层会添加TCP或者UDP头部&#xff0c;然后交给网络层&#xff0c;网络层会添加IP头部&#xff0c;然后交给数据链路层&#xff0c;数据链路层会添加以太网头部和以太网尾部&#xff0c;最后变成01这样…

基于nginx和ffmpeg搭建HTTP FLV流媒体服务器

一、简介 整体是使用nginx搭建HTTP FLV流媒体服务器&#xff1a; 流程&#xff1a;音视频->rtmp->http-flv 音视频转为rtmp需要借助ffmpeg转化。 rtmp转为http-flv需要借助nginx转化。 nginx-http-flv-module是基于nginx-rtmp-module开发的&#xff0c;包含nginx-rt…

Responder:功能强大的安全工具介绍

一、概述 定义与定位 Responder 是一款专为渗透测试人员和安全研究人员设计的工具。它专注于在网络环境中处理各种协议的响应&#xff0c;旨在帮助检测和利用网络中的潜在安全漏洞&#xff0c;尤其是与身份验证和网络服务相关的漏洞。主要运行在基于 Windows 和 Linux 的操作系…

基于Vue3的组件封装技巧分享

1、需求说明 需求背景&#xff1a;日常开发中&#xff0c;我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发&#xff0c;提升效率。有时我们需要进行个性化封装&#xff0c;以满足在项目中大量使用的需求。 错误示范&#xff1a;基于a-modal封装一个自定…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接&#xff1a;Uniapp Tool - IntelliJ IDEs Plugin | Marketplace &#xff08;结合自己的webstorm版本下载&#xff0c;不然解析不了&#xff09; 将下载到的zip文件防在webstorm安装路径下&#xff0c;本文的地址为&#xff1a; 2、安装uniapp插…

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单&#xff0c;只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包&#xff0c;OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本&#xff0c;底层依赖框架为Springfox。 此次在4…

DETR: End-to-End Object Detection with Transformers论文学习

论文地址&#xff1a;https://arxiv.org/pdf/2005.12872 代码地址&#xff1a;https://github.com/facebookresearch/detr 相关学习视频&#xff1a;https://space.bilibili.com/94779326/lists?sid1531941 标题前言&#xff1a; DETR 是 Facebook 团队于 2020 年提出的基于…