leetcode刷题-动态规划part02

news2024/11/14 18:29:24

代码随想录动态规划part02|62.不同路径 、63.不同路径II 、343. 整数拆分、

    • 62.不同路径
    • 63.不同路径 II
    • 343. 整数拆分 再看
      • 本题思路并不容易想,一刷建议可以跳过。如果学有余力,可以看视频理解一波。
    • 96.不同的二叉搜索树 跳过

62.不同路径

leetcode题目链接
代码随想录文档讲解

思路

若使用图论中的深度搜索、广度搜索,提交超时

  1. dp数组的含义:从[0,0]到[i,j]有多少种不同的路径
  2. dp[i][[j] = dp[i-1][j] + dp[i][j-1]
  3. 初始化,每一个状态都是从上面和左面得出来的,所以要初始化最上面一行和最左边一行:dp[0][j] = 1; dp[i][0] = 1
  4. 遍历顺序:从左向右,从上往下

在这里插入图片描述

伪代码(C++)

 

python代码

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1]*n]*m
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i-1][j]+dp[i][j-1]
        return dp[m-1][n-1]

63.不同路径 II

leetcode题目链接
代码随想录文档讲解

思路

在不同路径题目中添加了障碍

  1. dp数组的含义:从[0,0]到达[i,j]有多少不同的路径
  2. 递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1] if obs[i][j] ==0
  3. 初始化:因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0),并且之后的也全为0,初始化代码如下(for循环的终止条件添加一个obs判断)【如果起始位置和结束位置有障碍,那就是0种路径】
vector<vector<int>> dp(m, vector<int>(n, 0));
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;

==注意:==数组初始化要这么写:dp = [[0] * n for _ in range(m)]
在这里插入图片描述

伪代码(C++)

 

python代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
    	# 可添加判断起始位置和终止位置是否为0的代码,降低复杂度
        m, n = len(obstacleGrid), len(obstacleGrid[0])
        # dp数组初始化
        dp = [[0] * n for _ in range(m)]
        # dp = [[0]*n]*m
        for i in range(m):
            if obstacleGrid[i][0] != 0:
                break
            dp[i][0] = 1
        for j in range(n):
            if obstacleGrid[0][j] != 0:
                break
            dp[0][j] = 1
            
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 0:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[m-1][n-1]

343. 整数拆分 再看

本题思路并不容易想,一刷建议可以跳过。如果学有余力,可以看视频理解一波。

leetcode题目链接
代码随想录文档讲解

思路

example:拆10
10 = 2 × 8 (10的状态依赖2和8的状态)
8 = 2 + 6 (8的状态依赖2和6的状态)
可使用动态规划来解决此问题:

  1. dp 的含义:dp[i] i拆分后最大的乘积为dp[i]
  2. 递推公式:dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j)
    i = j + (i-j), 再对i-j继续进行拆分
  3. 初始化 dp[0]=0; dp[2]=1
  4. 遍历顺序:

伪代码(C++)

 

python代码

class Solution:
         # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
        # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
        # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
    def integerBreak(self, n):
        dp = [0] * (n + 1)   # 创建一个大小为n+1的数组来存储计算结果
        dp[2] = 1  # 初始化dp[2]为1,因为当n=2时,只有一个切割方式1+1=2,乘积为1
       
        # 从3开始计算,直到n
        for i in range(3, n + 1):
            # 遍历所有可能的切割点
            for j in range(1, i // 2 + 1):

                # 计算切割点j和剩余部分(i-j)的乘积,并与之前的结果进行比较取较大值
                
                dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j)
        
        return dp[n]  # 返回最终的计算结果

96.不同的二叉搜索树 跳过

leetcode题目链接
代码随想录文档讲解

思路

相当于爬楼梯题目的消费版

  1. dp数组的含义,到达i位置的花费为dp[i]
  2. dp[i]可由dp[i-1]跳1步或者dp[i-2]跳2步:dp[i] = min(dp[i-1] + cost[i-1] , dp[i-2] + cost[i-2])
  3. 初始化:dp[0]=0, dp[1]=0
  4. 每一个都是由前两个数组求得的,往前求

伪代码(C++)


python代码

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0] * (len(cost)+1)
        for i in range(2, len(cost)+1): 
            dp[i] = min(dp[i-1] + cost[i-1], dp[i-2]+cost[i-2])
        return dp[len(cost)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055443.html

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

相关文章

Netty源码小窥探(一)

记录背景 最近在学习Netty&#xff0c;阅读了部分源码&#xff0c;记录一下笔记&#xff0c;方便自己回顾和也希望能作为初学的小伙伴们的部分参考。 本次Netty源码小窥探会是一个小合集&#xff0c;因为个人能力有限&#xff0c;介绍程度肯定不会太深奥&#xff0c;个人是基…

记录|链接MySQL数据库实现学生管理系统

目录 前言一、管理系统的后台数据库1.1 创建DB库1.2 创建login表和student表login表student表 二、窗体创建1.1 VS项目框架1.2 窗口1设计&#xff1a;登录窗口所需控件界面效果 1.3 窗口2设计&#xff1a;学生信息管理界面添加新界面所需控件界面效果 1.4 窗口3设计&#xff1a…

用低代码平台搭建了一套贷前进件系统,1天搞定!

贷前进件系统是什么 贷前进件系统是指金融机构&#xff08;如银行、消费金融公司等&#xff09;在贷款申请过程中&#xff0c;用于收集、整理、审核和管理借款人申请资料的系统。该系统是贷款流程中的重要环节&#xff0c;主要作用在于提高贷款申请的处理效率&#xff0c;降低…

滑动变阻器的未来发展趋势和前景如何?是否有替代品出现?

滑动变阻器是常见的电子元件&#xff0c;主要用于调节电路中的电阻值。随着科技的不断发展&#xff0c;滑动变阻器的未来发展趋势和前景也引起了广泛关注。 滑动变阻器的未来发展将更加注重智能化&#xff0c;随着物联网、人工智能等技术的快速发展&#xff0c;滑动变阻器也将与…

Transformer中的位置编码:绝对位置编码、相对位置编码与旋转位置编码

1. 引言 Transformer模型自2017年提出以来&#xff0c;凭借其在序列到序列任务中的优异表现&#xff0c;迅速成为自然语言处理&#xff08;NLP&#xff09;领域的主流模型。与传统的循环神经网络&#xff08;RNN&#xff09;不同&#xff0c;Transformer模型完全基于自注意力机…

Java 入门指南:反射机制

RTTI RTTI&#xff08;Run-Time Type Identification&#xff09;是一种在运行时确定对象类型的机制。它是一种编程语言特性&#xff0c;主要用于在运行时动态识别和处理对象的实际类型。 通过 RTTI&#xff0c;可以在运行时根据对象的实际类型执行相应的操作。这在处理多态对…

sdn nce insight

SDN&#xff08;Software-Defined Networking&#xff09; 和 NFV&#xff08;Network Functions Virtualization&#xff09; 是现代网络架构中的两项关键技术&#xff0c;它们共同推动了网络的虚拟化、自动化和灵活性。尽管它们各自有不同的焦点和应用领域&#xff0c;但通常…

HarmonyOS应用四之页面加载构建以及数据请求

目录&#xff1a; 1、加载网络页面/本地页面/html页面2、页面布局3、HTTP/HTTPS的数据请求4、上传图片并保存数据 1、加载网络页面/本地页面/html页面 // xxx.ets import { webview } from kit.ArkWeb; import { BusinessError } from kit.BasicServicesKit;Entry Component s…

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景

消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式&#xff08;Push&#xff09;和拉模式&#xff08;Pull&#xff09;各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景&#xff1a; 推模式&#xff08;Push&#xff09; 特点&#xff1a;…

进哥在线shinyapps工具(自备)

Jingle’s shinyapps toolkit – 王进的个人网站 (jingege.wang) 一些常用生物信息学分析可视化apps&#xff0c;以及一些分子生物学分析工具&#xff08;尴尬&#xff0c;一直忘记附上链接&#xff09; Jingles toolkit 可以进行多种分析&#xff1a; 1. General plots示例…

putty中修改默认窗口大小和字体、字号

在WinSCP中调用putty&#xff0c;发现默认窗口太小&#xff0c;字号也很小&#xff0c;非常不友好。现在显示器都是1080p起步&#xff0c;所以很有必要修改之。 以中文版v0.70为例&#xff0c;方法&#xff1a; 1. 点击左上角图标 &#xff0c;选择下拉菜单中的“修改设置”&…

Qt-信号和槽(8)

目录 信号的概念 Qt中的信号三要素 connect函数 connect的原型 connect的使用 信号函数和槽函数 参数匹配 close关闭槽函数 运行结果 第一个问题&#xff1a;怎么知道 手册使用 第二个问题&#xff0c;为什么可以直接传递函数指针 自定义槽函数 第一种自定义槽函…

Flask详细教程

1、Flask是什么&#xff1f; Flask是一个非常小的PythonWeb框架&#xff0c;被称为微型框架&#xff08;类似Java的SpringBoot&#xff09;&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&a…

前端css动画transform多个属性值写法

X轴平移400px transform: translateX(400px); X轴平移400px并缩小0.5倍 transform: translateX(400px) scale(0.5); X轴平移400px并旋转45度 transform: translateX(400px) rotate(45d…

农产品智慧物流系统pf

TOC springboot537农产品智慧物流系统pf 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…

『 Linux 』利用UDP套接字实现简单群聊

文章目录 服务端通过传入命令处理实现远程命令执行使用Windows编辑UDP客户端实现Windows远程控制Linux接收套接字的其他信息UDP套接字简单群聊服务端UDP套接字简单群聊客户端运行测试及分离输入输出 参考代码 服务端通过传入命令处理实现远程命令执行 『 Linux 』利用UDP套接字…

led台灯对眼睛好不好?台灯太亮会影响视力吗?解锁护眼台灯小知识

中国的近视情况十分严峻&#xff0c;尤其在青少年群体中表现得更为突出。据统计&#xff0c;中国青少年的近视率高居世界第一&#xff0c;这主要与长时间的近距离用眼、过度使用电子产品以及户外活动时间减少等因素有关。优质的护眼台灯不仅能减少近视的发生率&#xff0c;还能…

创建一个简单的Vue3.0应用程序

1、Vue.createApp() 方法的介绍 每一个 Vue.js 的应用都需要创建一个应用程序的实例对象并挂载到指定 DOM 上。在 Vue3.0 中&#xff0c;创建一个应用程序实例的语法格式如下&#xff1a; Vue.createApp(App) createApp() 是一个全局 API&#xff0c;它接收一个根组件选项对…

基于SpringBoot+Vue疫情物资捐赠和分配系统--论文pf

TOC springboot518基于SpringBootVue疫情物资捐赠和分配系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往…