「代码随想录算法训练营」第二十九天 | 动态规划 part2

news/2025/3/17 2:47:40/文章来源:https://www.cnblogs.com/frontpen/p/18342588

62. 不同路径

题目链接:https://leetcode.cn/problems/unique-paths/
题目难度:中等
文章讲解:https://programmercarl.com/0062.不同路径.html
视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/
题目状态:还是想不出 dp 数组,看题解了

思路:

首先构建一个 dp 数组,这次是一个二维数组,dp[i][j] 表示从 (0, 0) 到 (i, j)的路径个数。很容易想到:dp[1][j] 的个数是由 dp[i - 1][j] + dp[i] [j - 1] 得来的,且在路径边缘只需要一条路径就能到达,因此整体路径的个数如下图所示:

image

代码:

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for(int i = 0; i < m; ++i) dp[i][0] = 1;for(int j = 0; j < n; ++j) dp[0][j] = 1;for(int i = 1; i < m; ++i) {for(int j = 1; j < n; ++j) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};

63. 不同路径 II

题目链接:https://leetcode.cn/problems/unique-paths-ii/
题目难度:中等
文章讲解:https://programmercarl.com/0063.不同路径II.html
视频讲解:https://www.bilibili.com/video/BV1Ld4y1k7c6/
题目状态:能想到怎么解,但参数输入给我看懵了

思路:

和上面一题思路差不多,只不过是要判断一下当前位置是否有障碍物,若有障碍物就过不来,因此到达障碍物的路径依旧是0,还要注意的一点是,若在边缘中某一位置出现在障碍物,则该位置到其后面一直都过不去,因此后面一直都是 0 。

image

代码:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if(obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1)return 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;for(int i = 1; i < m; ++i) {for(int j = 1; j < n; ++j) {if(obstacleGrid[i][j] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};

343. 整数拆分

题目链接:https://leetcode.cn/problems/integer-break/
题目难度:中等
文章讲解:https://programmercarl.com/0343.整数拆分.html
视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ/
题目状态:看题解了

思路:

分开遍历整数,将其拆为 i 和 j,结果为 i * j,找到 i * j 的最大值。而后面一个整数的乘积也可以通过前一个拆分出来的整数的乘积最大值再乘剩余的部分得出。

代码:

class Solution {
public:int integerBreak(int n) {vector<int> dp(n + 1);dp[2] = 1;for(int i = 3; i <= n; ++i) {for(int j = 1; j <= i / 2; ++j) {dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];}
};

也可以使用贪心算法,但是没有看太懂,代码如下:

class Solution {
public:int integerBreak(int n) {if (n == 2) return 1;if (n == 3) return 2;if (n == 4) return 4;int result = 1;while (n > 4) {result *= 3;n -= 3;}result *= n;return result;}
};

96. 不同的二叉搜索树

题目链接:https://leetcode.cn/problems/unique-binary-search-trees/
题目难度:中等
文章讲解:https://programmercarl.com/0096.不同的二叉搜索树.html
视频讲解:https://www.bilibili.com/video/BV1eK411o7QA/
题目状态:看完题一点思路没有,看题解

思路:

将二叉搜索树拆分,按其左右子树分别往下拆,最后将左右子树得到的二叉搜索树的个数相加获得。

代码:

class Solution {
public:int numTrees(int n) {vector<int> dp(n + 1);dp[0] = 1;for(int i = 1; i <= n; ++i) {for(int j = 1; j <= i; ++j) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
};

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

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

相关文章

一直让 PHP 程序员懵逼的同步阻塞异步非阻塞,终于搞明白了

经常听到身边写 Java、Go 的朋友提到程序异步、非阻塞、线程、协程,让系统性能提高到百万、千万并发,使我甚是惊讶属实羡慕。大家好,我是码农先森。 经常听到身边写 Java、Go 的朋友提到程序异步、非阻塞、线程、协程,让系统性能提高到百万、千万并发,使我甚是惊讶属实羡慕…

感谢「河南图奕网络」赞助园子,成为第一家创始赞助商

在8月1日发布救援行动-赞助商计划后,我们并没有抱什么奢望,更没有妄想很快能找到赞助商,只是为救园多一点可能的希望,万一找到一家赞助商,就会多一份救园力量。没想到第2天就有幸遇到一家有意向的企业在8月1日发布救援行动-赞助商计划后,我们并没有抱什么奢望,更没有妄想…

数据跨境流动需要注意什么?怎么实现安全合规的跨境传输?

2024年3月22日,《促进和规范数据跨境流动规定》(以下简称《数据跨境规定》)正式公布并施行。数据跨境流通涉及到隐私保护、安全性和法律合规等多个方面的重要考虑因素。 具体来说,需要注意以下几点: 1、隐私保护:跨境数据流通涉及个人数据,需要确保数据在传输和存储过程…

什么样的跨网文件安全交换系统是IC设计企业需要的?

对于IC设计企业来说,设计数据和文件是企业最根本核心的数据资产,在半导体芯片的设计、仿真验证的过程中,会产生多种不同的文件类型: 需求调研:对于芯片具体需求的调研总结,如调研报告、图表、导图等; 功能与架构方案制定:作为IC设计最重要的部分,对于芯片的实现功能、…

RAG知识库之针对长文档的Raptor索引

在现有的朴素RAG应用中其只是简单的对文档进行分块后存储的向量库中,然后在使用是根据 提问问题 从查询向量库中查询相识度较高的文档快作为问题上下文提交到LLM让其根据上下文去回答用户所提问的问题。对于小文本可以直接将整个文档作为上下文或使用上篇文章所提到的多表示索…

《花100块做个摸鱼小网站! 》第一篇—买云服务器和初始化环境

一、前言 大家好呀,我是summo,前面我已经写了我为啥要做这个摸鱼小网站的原因,从这篇文章开始我会一步步跟大家聊聊我是怎么搭起这个网站的。我知道对很多新手来说,建网站可能挺头大的,不知道从哪里开始,所以我会尽量写得简单明了,让大家一看就懂,少走弯路。 咱们先从买…

Outlook如果有多个邮箱,个别邮箱设定不接收邮件的设定方法

背景:大家是不是经常用到outlook的时候,因为种种原因,某个邮箱暂时不用,或者之前的工作邮箱因为离职而导致无法正常登录,但是很多有用的邮件或者回忆都在这个邮箱里,因此不忍心删除掉,并且又不想总是被提示“邮箱登录异常……”等弹出框,现在告诉大家一个解决办法。 1、…

【解决方案】Java 互联网项目中消息通知系统的设计与实现(下)

书接上回,消息通知系统(notification-system)作为一个独立的微服务,完整地负责了 App 端内所有消息通知相关的后端功能实现。该系统既需要与文章系统、订单系统、会员系统等相关联,也需要和其它业务系统相关联,是一个偏底层的通用服务系统。目录前言四、技术选型五、后端…

查看matplotlib中默认字体

import matplotlib.pyplot as plt# 显示默认字体的属性 font_properties = plt.matplotlib.font_manager.FontProperties() print(font_properties.get_name()) # 默认字体名称 print(font_properties.get_size()) # 默认字体大小 print(font_properties.get_family()) # 默…

分享一个 BACnet 调试工具 工程师必备

BACnet 调试工具 工程师必备 官网地址 BACnet(Building Automation and Control Networks)是由美国采暖、制冷与空调工程师学会(American Society of Heating, Refrigerating and Air-Conditioning Engineers,简称ASHRAE)开发和维护的。ASHRAE 是一个专业协会,致力于采暖…

读零信任网络:在不可信网络中构建安全系统09用户信任

用户信任1. 用户信任 1.1. 将设备身份和用户身份混为一谈会导致一些显而易见的问题1.1.1. 特别是当用户拥有多台设备时,而这种情况很普遍1.1.2. 应该针对不同类型的设备提供相匹配的凭证1.1.3. 在存在共用终端设备的情况下,所有的这些问题将更加凸显1.2. 需要将用户的识别和信…

Golang语言之管道channel快速入门篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.channel的基本使用1.channel概述2.管道入门案例2.1 有缓冲管道和无缓冲管道概述2.2 有缓冲管道2.3 无缓冲管道3.管道的关闭3.1 管道关闭操作结果概述3.2 管道关闭案例3.3 判断通道是否关闭4.管道的遍历…