动态规划相关题目

文章目录

  • 1.动态规划理论基础
  • 2.斐波那契数
  • 3.爬楼梯
  • 4.使用最小花费爬楼梯
  • 5.不同路径
  • 6.不同路径 II
  • 7. 整数拆分
  • 8. 不同的二叉搜索树

1.动态规划理论基础

1.1 什么是动态规划?

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。

1.2 动态规划的解题步骤

动态规划五部曲:

  • 确定dp数组(dp table)以及下标的含义
  • 确定递推公式
  • dp数组如何初始化
  • 确定遍历顺序
  • 举例推导dp数组

2.斐波那契数

题目:
在这里插入图片描述
思路:
状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]

代码:

class Solution:def fib(self, n: int) -> int:# 排除 Corner Caseif n == 0:return 0# 创建 dp table 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]

3.爬楼梯

题目:
在这里插入图片描述
思路:
递推公式dp[i] = dp[i - 1] + dp[i - 2]

代码:

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

4.使用最小花费爬楼梯

题目:
在这里插入图片描述
思路:
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。
递推公式:
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
:楼顶的下标是n+1

代码:

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):# 在第i步,可以选择从前一步(i-1)花费体力到达当前步,或者从前两步(i-2)花费体力到达当前步# 选择其中花费体力较小的路径,加上当前步的花费,更新dp数组dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])return dp[len(cost)]  # 返回到达楼顶的最小花费

5.不同路径

题目:
在这里插入图片描述
思路:
dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

代码:

class Solution:def uniquePaths(self, m: int, n: int) -> int:# 创建一个二维列表用于存储唯一路径数dp = [[0] * n for _ in range(m)]# 设置第一行和第一列的基本情况for i in range(m):dp[i][0] = 1for j in range(n):dp[0][j] = 1# 计算每个单元格的唯一路径数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]

6.不同路径 II

题目:
在这里插入图片描述
思路:
【注】边界初始化时要注意障碍物,还要考虑到起始点和终止点的障碍物
当网格中没有障碍物时,执行递推公式。

代码:

class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m = len(obstacleGrid)n = len(obstacleGrid[0])if obstacleGrid[0][0] == 1 or obstacleGrid[m - 1][n - 1] == 1:return 0dp = [[0] * n for _ in range(m)]i = 0j = 0while i < m and obstacleGrid[i][0] != 1:dp[i][0] = 1i += 1while j < n and obstacleGrid[0][j] != 1:dp[0][j] = 1j += 1for i in range(1,m):for j in range(1,n):if obstacleGrid[i][j] != 1:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]return dp[m-1][n-1]

7. 整数拆分

题目:
在这里插入图片描述
思路:
dp[i]:分拆数字i,可以得到的最大乘积为dp[i]

递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});

代码:

class Solution:def integerBreak(self, n: int) -> int:dp = [0] * (n + 1)for i in range(2,n+1):j = 1while j <= i // 2:dp[i] = max(j * (i - j),j*dp[i - j],dp[i])j += 1return dp[n]

8. 不同的二叉搜索树

题目:
在这里插入图片描述
思路:
思路详解

代码:

class Solution:def numTrees(self, n: int) -> int:dp = [0] * (n + 1)  # 创建一个长度为n+1的数组,初始化为0dp[0] = 1  # 当n为0时,只有一种情况,即空树,所以dp[0] = 1for i in range(1, n + 1):  # 遍历从1到n的每个数字for j in range(1, i + 1):  # 对于每个数字i,计算以i为根节点的二叉搜索树的数量dp[i] += dp[j - 1] * dp[i - j]  # 利用动态规划的思想,累加左子树和右子树的组合数量return dp[n]  # 返回以1到n为节点的二叉搜索树的总数量

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

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

相关文章

安卓逆向 | JEB静态分析APK

JEB反编译APK-静态审计&#xff0c;找到加密算法 参考来源&#xff1a;https://blog.csdn.net/weixin_38819889/article/details/108910525 apk来源&#xff1a;https://app5.scrape.center/ 软件&工具&#xff1a;JEB / 雷电模拟器 / burpsuite 声明&#xff1a;scrape.ce…

浅模仿小米商城布局(有微调)

CSS文件 *{margin: 0;padding: 0;box-sizing: border-box; }div[class^"h"]{height: 40px; } div[class^"s"]{height: 100px; } .h1{width: 1528px;background-color: green; } .h11{background-color:rgb(8, 220, 8); } .h111{width: 683px;background-c…

【差分约束+并查集】第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…

基于java+springboot+vue实现的成都旅游网系统(文末源码+Lw+ppt)23-358

摘 要 人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套成…

代码随想录算法训练营Day60 ||leetCode 84.柱状图中最大的矩形

84.柱状图中最大的矩形 这题和接雨水的题有些像&#xff0c;只不过此处使用的是递增栈&#xff0c;因为矩形的面积想要增加宽度时&#xff0c;需要考虑两边最低的矩形&#xff0c;而为了让所有数据都参加运算&#xff0c;需要前后补0&#xff0c;来弹出栈里所有元素 class Sol…

15 Games101 - 笔记 - 光线追踪(辐射度量学、BRDF与渲染方程)

15 光线追踪&#xff08;辐射度量学、BRDF与渲染方程&#xff09; 基于物理渲染的基础知识 摘要 本篇文章将会从基于物理渲染(PBR)的动机开始讲起&#xff0c;逐步介绍PBR相关的基础知识&#xff0c;如辐射度量学(怎么用物理量精确的描述光线)&#xff0c;以及通过辐射度量学…

MySQL高阶SQL语句

文章目录 MySQL高阶SQL语句MySQL常用查询1、按关键字排序1.1 语法1.2 ASC和DESC1.3 对数据表中信息进行排序1.3.1 普通排序1.3.2 结合where进行条件过滤1.3.3 对多个字段进行排序 2、区间判断及查询不重复记录2.1 and/or —— 且/或2.1.1 普通查询2.1.2 嵌套/多条件查询 2.2 di…

OD C卷 - 反射计数

反射计数&#xff08;200&#xff09; 给定一个包含0 、1的二维矩阵&#xff1b;一个物体从给定的初始位置出发&#xff0c;在给定的速度下移动&#xff0c;遇到矩阵的边缘则发生镜面反射&#xff0c;无论物体经过0还是1&#xff0c;都不影响其速度&#xff1b;经过t时间单位后…

【unity】如何汉化unity编译器

在【unity】如何汉化unity Hub这篇文章中&#xff0c;我们已经完成了unity Hub的汉化&#xff0c;现在让我们对unity Hub安装的编译器也进行下汉化处理。 第一步&#xff1a;在unity Hub软件左侧栏目中点击安装&#xff0c;选择需要汉化的编译器&#xff0c;再点击设置图片按钮…

淘宝自动发货接口是指淘宝开放平台提供的一种接口,用于实现商家在淘宝平台上自动发货的功能

淘宝自动发货接口是指淘宝开放平台提供的一种接口&#xff0c;用于实现商家在淘宝平台上自动发货的功能。通过该接口&#xff0c;商家可以将订单信息与物流信息传递给淘宝平台&#xff0c;由平台自动完成订单发货的操作&#xff0c;提高发货效率和准确性。 淘宝自动发货接口的…

手机termux免root安装kali:一步到位+图形界面_termux安装kali-

1.工具 安卓包括鸿蒙手机、WiFi、充足的电量、脑子 2.浏览器搜索termuxvnc viewer下载安装。 3.对抗华为纯净模式需要一些操作先断网弹窗提示先不开等到继续安装的时候连上网智能检测过后就可以了 termux正常版本可以通过智能监测失败了就说明安装包是盗版 4.以后出现类似…

Jenkins常用插件安装及全局配置

Jenkins常用插件安装及全局配置 前言 ​ Jenkins是一个流行的持续集成工具&#xff0c;通过安装适用的插件&#xff0c;可以扩展Jenkins的功能&#xff0c;并与其他工具和系统集成。本文将介绍一些常用的Jenkins插件以及安装和配置的步骤。通过安装和配置这些常用插件&#xf…

【EI会议征稿通知】电子、通信与智能科学国际会议(ECIS 2024)

电子、通信与智能科学国际会议&#xff08;ECIS 2024&#xff09; The International Conference on Electronics, Communications and Intelligent Science 电子、通信与智能科学国际会议&#xff08;ECIS 2024&#xff09;将于2024年05月24日-05月27日在中国长沙召开。ECIS…

指数强劲反弹,计算机板块表现活跃,北京两融开户佣金和融资融券利息率最低多少?哪个券商最低?支持量化交易?

股市行情的波动是由多种因素共同影响的&#xff0c;其中包括市场情绪、投资者对经济走势的预期、政策变化等等。本文提到的指数强劲反弹和计算机板块的活跃表现可能是由以下几个因素所推动的&#xff1a; 市场情绪改善&#xff1a;当投资者对市场的信心增加时&#xff0c;他们更…

C语言字节对齐关键字__attribute__((aligned(n)))的使用

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作&#xff0c;有些是为了加速对内存的访问。因此&#xff0c;学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

谈谈变压器中的位置编码

变压器中的位置编码 一、说明 在上一期的“Transformers for Everyone”系列中&#xff0c;我们介绍了 Transformer 的概念&#xff0c;并深入研究了第一个关键架构元素&#xff1a;输入嵌入。如果你错过了第一集&#xff0c;你可以通过阅读来赶上&#xff1a;适合所有人的变形…

IRIS / Chronicles 数据库结构

对于我们用得最多的关系型数据库来说&#xff0c;首先有的是数据库名字&#xff0c;然后是表名字&#xff0c;然后就是字段名&#xff0c;随后就是一条一条的数据。 对于 IRIS 来说&#xff0c;因为是使用的层级数据库&#xff0c;所以上面的定义就不能完全的照搬了&#xff0…

【傅里叶变换、短时傅里叶变换、小波变换】

傅里叶&#xff1a;可以知道信号中的成分&#xff0c;但对非平稳过程&#xff0c;不能看出各成分出现的时刻短时傅里叶变换-&#xff1a;加固定窗的傅里叶变换&#xff0c;无法满足非稳态信号变化的频率的需求小波变换&#xff1a;时域能量有限&#xff0c;频域带通滤波 一、傅…

系统可靠性分析与设计相关知识总结

一、软件可靠性定义 软件可靠性使软件产品在规定的条件下和规定的时间区间内完成规定的功能的能力。是软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下维持软件系统功能特性的基本能力。 规定的条件&#xff1a;直接与软件运行相关的使用该软件的计算机系统…