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

news2024/12/16 0:32:41

动态规划理论基础

        解释:动态规划,英文: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数组打印出来看看和我们推导的数列是不是一致的;

class Solution:
    def fib(self, n: int) -> int:
        # 首先排除边的情况
        if n == 0:
            return 0
        # 创建dp表
        dp = [0]*(n+1)

        # 初始化dp数组
        dp[0] = 0
        dp[1] = 1

        # 遍历顺序,从前向后,
        for i in range(2, n+1):
            # 确定状态转移公式
            dp[i] = dp[i-1] + dp[i-2]

        return dp[n]

if __name__ == '__main__':
    n = 2
    res = 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;

class Solution:
    def climbStairs(self, n: int) -> int:
        # 边缘判断
        if n <= 1:
            return n
        # 定义一个空数组
        dp = [0]*(n+1)
        # 初始化参数
        dp[1] = 1
        dp[2] = 2
        for i in range(3, n+1):
            # 状态方程
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

if __name__ == '__main__':
    n = 5
    res = 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数组的状态变化,如下:

from typing import List
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0]*(len(cost)+1)
        # 初始化,表示从起点开始和第一个索引下开始不需要花费体力
        dp[0] = 0
        dp[1] = 0
        for 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.coloradmin.cn/o/2260204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亮相AICon,火山引擎边缘云揭秘边缘AI Agent探索与实践

12月13-14日&#xff0c;AICon 全球人工智能开发与应用大会在北京成功举办。火山引擎边缘智能技术负责人谢皓受邀出席大会&#xff0c;以《AI Agent 在边缘云的探索与实践》为主题&#xff0c;与全球 AI 领域的资深专家&#xff0c;共同深入探讨大模型落地、具身智能、多模态大…

找出1000以内的所有回文数

找出1000以内的所有回文数 方法概述检查回文数的方法伪代码C代码实现代码解析运行结果在计算机科学中,回文数是一种具有对称性质的数,即从左向右读和从右向左读都是相同的。例如,121、1331、12321都是回文数。本文将利用数据结构、C语言和算法的知识来编写一个程序,找出100…

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学&#xff0c;想必大家对它不是非常陌生了吧&#xff0c;这期呢&#xff0c;我主要是围绕以下几点展开&#xff0c;重点给大家介绍 里…

基于springboot+vue的高校校园交友交流平台设计和实现

文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我&#xff1f; 关于我项目开发案例我自己的网站 源码获取&#xff1a; 系统功能 校园交友平台…

33.攻防世界upload1

进入场景 看看让上传什么类型的文件 传个木马 把txt后缀改为png 在bp里把png改为php 上传成功 用蚁剑连接 在里面找flag 得到

基于Python+Sqlite3实现的搜索和推荐系统

基于Python实现的搜索和推荐系统 一、引言 伴随着科技的不断进步&#xff0c;互联网&#xff0c;万维网的不断发展。我们越来越热爱万维网&#xff0c;也欣赏他的发展方式。20世纪90年代初&#xff0c;万维网还只是一个将文档联系起来的简单网络。如今&#xff0c;他已经成为…

使用idea创建一个JAVA WEB项目

文章目录 1. javaweb项目简介2. 创建2.1 idea新建项目2.2 选择&#xff0c;命名2.3 打开2.4 选择tomcat运行2.5 结果 3. 总结 1. javaweb项目简介 JavaWeb项目是一种基于Java技术的Web应用程序&#xff0c;主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上&a…

【潜意识Java】Java基础教程:从零开始的学习之旅

目录 1. Java 简介 2. Java 程序结构 2.1 包声明&#xff08;Package Declaration&#xff09; 2.2 导入语句&#xff08;Import Statement&#xff09; 2.3 类声明&#xff08;Class Declaration&#xff09; 2.4 main 方法&#xff08;Main Method&#xff09; 3. Jav…

算法题(2):三步问题

审题&#xff1a;需要输出小孩上楼梯的方式的数量&#xff08;需要取模&#xff09; 思路&#xff1a; 如果正面来思考这个问题会无从下手&#xff0c;因为我们的分类太多了&#xff0c;没有办法把大问题缩小。 但是如果反过来思考&#xff0c;小孩最后一步有几种情况&#xff…

Quad Remesher使用教程

为什么要拓扑&#xff1f; 我们知道&#xff0c;模型在三维软件中的表现&#xff0c;是由一系列的面通过不同角度组合而成的。3D模型制作层面上的拓扑&#xff0c;按我的理解来说&#xff0c;就是一个模型的面的结构分布——布线。想表现和制作一个三维模型&#xff0c;有无限…

Android 使用Overlay现实主题切换

最近项目上&#xff0c;想做一个主题切换的功能&#xff0c;整理了一下发布出来&#xff0c;主要使用的是IOverlayManager&#xff0c;大体思路如下&#xff1a; 1、想切换的应用&#xff0c;各自做overlay apk&#xff08;简称皮肤包&#xff09; 2、将overlay apk push 到v…

apk反编译修改教程系列-----超简单修改apk中名称 包名 布局文本以及其中的文字选项 手机设置中apk对应修改演示【三十三】

💝💝💝在反编译apk中,每个初学者可能最感兴趣入门的就是修改包名 去更新以及其中选项文本的修改。这样循序渐进来激发学习的兴趣。了解一些apk中常见的修改方法。对于修改手机rom中的 系统类等等的apk原理都是一样的。这篇是应粉丝需要的修改apk基础教程. 通过博文了解…

02HBuilder工具准备

一、下载网址&#xff1a; HBuilder 使用教程 | 菜鸟教程 DCloud - 数字天堂官网、HBuilderX、HBuilder、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 二、下载 三、解压 四、启动程序

记一个framebuffer显示混乱的低级错误

记一个framebuffer显示混乱的低级错误 由于framebuffer的基础知识不扎实&#xff0c;这个任务上我多卡了两天&#xff0c;差点把我搞死&#xff0c;于此记录为后鉴。 打算用awtk做一个多进程项目&#xff0c;计划把framebuffer的内容通过websocket输出到浏览器上去显示画面, …

C++---入门

C补充了上的不足&#xff0c;使用各方面更加便捷&#xff0c;在C的基础上面向对象进行编译&#xff0c;学过C之后&#xff0c;对学习C的一定的帮助。 命名空间&#xff1a; namesp的定义&#xff1a;定义命名空间&#xff0c;需要使⽤到namespace关键字&#xff0c;后⾯跟命…

boost电路的同步和异步模式 及CCM、DCM模式 介绍

一、同步 异步 1.一般区别 电路结构 异步升压 IC&#xff1a;采用传统的 Boost 电路结构&#xff0c;主要由电感、开关管、二极管和输出电容等组成。同步升压 IC&#xff1a;与异步升压 IC 的 Boost 电路相比&#xff0c;其将二极管替换成了一个同步整流 MOS 管&#xff0c;…

yolov7源码解读1-训练前准备

一、怎么解决图片输入尺度不统一的问题 YOLOv7的矩形训练是指在训练时对输入图片进行尺寸调整&#xff0c;以提高模型处理长宽比差异较大的图片时的性能&#xff0c;同时避免过多的图像变形。具体来说&#xff0c;以下是矩形训练的处理过程&#xff1a; 1. 矩形训练的核心目标…

用梗营销来启动市场

目录 为什么梗营销适合初创公司 有效的梗营销技巧 梗不仅仅是有趣的图片&#xff0c;它们是包裹在幽默中的文化时刻。对于小企业家&#xff08;以及大企业家&#xff09;&#xff0c;梗代表了一种强大且性价比高的市场推广方式。让我们分解一下为什么梗营销有效&#xff0c;以…

职业院校人工智能实验室解决方案

随着人工智能技术的迅猛发展&#xff0c;企事业单位对具备高素质技术应用能力的人才需求愈发迫切&#xff0c;目前人工智能已经逐步从感知理解阶段转变为生成创造阶段&#xff0c;可以为各行各业提供多维的智能化应用服务。2024年的《政府工作报告》中首次提出了“人工智能”行…