【算法day27】动态规划:基础2

题目引用


  1. 不同路径
  2. 不同路径II
  3. 整数拆分
  4. 不同的二叉搜索树

1. 不同路径


一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:
在这里插入图片描述
输入:m = 3, n = 7
输出:28

我们还是五步走:
1.确定dp数组(dp table)以及下标的含义
到达当前位置共有多少种方法
2.确定递推公式
当我们到达当前位置时,只会是从上一个格子或者左一个格子过来的,其实就和昨天的题目差不多了。
dp[i][j]=dp[i-1][j]+dp[i][j-1]

3.dp数组的初始化
看到这道题目,其实我们是不难想到,当我们从起点一直往右走或者一直往下走都是只有1种方法的,因此我们就直接将dp数组的第0行和第0列赋值为1即可。
4.确定遍历顺序
这道题目就是从左到右、从上到下的顺序啦
5.举例推导dp数组

那么我们直接来看代码:

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];}
};

2. 不同路径II


给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 109。

示例 1:
在这里插入图片描述
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1.向右 -> 向右 -> 向下 -> 向下
2.向下 -> 向下 -> 向右 -> 向右

这题我们可以看到其实题目就是在过程中加入了障碍物这一概念,所以我们和上一题不同的地方就是初始化和遍历过程中如果遇到障碍物怎么解决的问题。初始化比较容易解决,遇到障碍物时我们可以想象到我们后面直接不赋值就好了,为什么,因为不可能找到方法再赋值了。
那么过程中的障碍物怎么解决呢,就是将遇到障碍物的位置不进行赋值,其他位置正常赋值,当遇到上面是障碍物时,我们只能从左边得到方法数,当遇到左边是障碍物时,只能从上边得到方法数。
来看代码吧:

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

3. 整数拆分


给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

还是那五步
1.确定dp数组(dp table)以及下标的含义
我们可以做一个类似于哈希表的映射,每一位的dp[i]都代表i能够拆分成的乘积最大数
2.确定递推公式
所以我们这里的dp[i]就很好推了,
dp[i]=max(dp[i],max((i-j)* j,dp[i-j] * j));
j是不大于i/2的值,我们利用循环嵌套将每一个可能的数进行比对而不产生重复判断,这样就可以得到dp[i]的乘积最大值。
3.dp数组的初始化
dp[2]=1
4.确定遍历顺序
我们这里还是从左到右
5.举例推导dp数组

那么来看代码吧

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(dp[i-j]*j,(i-j)*j));}}return dp[n];}
};

4. 不同的二叉搜索树


给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:
在这里插入图片描述
输入:n = 3
输出:5

这道题目其实在咱们学习数据结构的时候就多多少少接触过了,我们先来思考一下n==3时为什么是五个
题目的示例可以很直观的体现这一点,当我们1打头时 左0右2
当我们2打头时 左1右1
当我们3打头时 左2右0
我们再想想,我们树只有一个节点时,只有一种树,两个节点时,有两种树,那这个3个节点的时候是不是就是根据左右孩子的节点数不同来得到不同树的数量呢,1打头等于1乘2,2打头等于1乘1,3打头等于2乘1,再累加,就求出结果了,那么我们的状态表达式也就出来了:

for(int j=1;j<=i;j++){dp[i]+=dp[i-j]*dp[j-1];}

那么我们再初始化dp[0],这题就出来了。
来看代码:

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[i-j]*dp[j-1];}}return dp[n];}
};

总结


今天的题目有一点不太好写,大家好好思考呀~

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

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

相关文章

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

PawSQL性能巡检平台 (3) - 慢查询采集和优化

在数据库运维管理中&#xff0c;慢查询一直是影响系统性能的重要因素。本文将详细介绍PawSQL数据库性能巡检平台在慢查询管理和优化方面的功能特性&#xff0c;帮助数据库管理员更好地应对性能挑战。 一、PawSQL巡检平台慢查询管理概述 PawSQL平台提供了全面的慢查询管理功能&…

检索增强生成(RAG)的全面综述:演进、当前格局与未来方向

摘要 https://arxiv.org/pdf/2410.12837 本文全面研究了检索增强生成&#xff08;RAG&#xff09;&#xff0c;追溯了其从基础概念到当前最先进技术的演变历程。RAG将检索机制与生成式语言模型相结合&#xff0c;以提高输出的准确性&#xff0c;从而解决了大型语言模型&#…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

拓展C盘内存的方法(C盘旁边不一定是D盘)

问题&#xff1a; 比如&#xff1a;windows现在C盘200GB&#xff0c;D盘600GB&#xff0c;准备额外拓展一个新的盘2TB&#xff0c;如何把新的盘中500GB拓展到C盘中 总结&#xff1a; 通过磁盘管理&#xff1a;如果C盘旁边有未分配空间&#xff0c;可以直接使用“扩展卷”功能…

基于springboot的膳食问答系统的设计与实现

摘 要 本文介绍了一个基于SpringBoot框架的膳食问答系统&#xff0c;该系统融合了文章查看、膳食问答、用户管理、文章管理、知识点管理、系统日志查看、在线用户查看以及办公管理等多项功能。系统采用主流界面设计风格&#xff0c;前端使用HTML构建用户界面&#xff0c;后端则…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中&#xff0c;ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成&#xff08;例如Microsoft Excel、Word、Internet Explorer等&#xff09;。以下是一些建议&#xff0c;帮助您更好地在LabVIEW中使用ActiveX控件&#xff1a; ​ 1. 理解ActiveX控件的基本原…

使用套接字创建一个服务端,创建一个客户端然后相互通讯

以下是对上述代码的详细解释&#xff1a; #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>#include <stdio.h> #include <stdlib.h> #include <string.h&…

17.3、网络安全应急响应技术与常见的工具

目录 应急响应常用技术分类信息系统容灾恢复入侵取证过程网络安全应急响应参考案例——阿里云安全应急响应服务阿里云应急响应服务网络安全应急响应参考案例—永恒之蓝Wannacry 应急响应常用技术分类 一共五个类别&#xff0c;访问控制、安全评估系统&#xff0c;恢复、安全监测…

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少 1. 类型说明2. 字符和字节的转换 二、字符串类型的异同 1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场&#xff0c;欢迎关注O。 本篇博主开始谈谈MySQ…

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求&#xff1a; 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址&#xff1a;https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…

03-系统调用

一、系统调用的概述 1.系统调用介绍 系统调用是操作系统提供给用户用来操作内核服务的一组接口&#xff08;函数&#xff09;的统称。 为什么要通过系统调用来访问系统资源&#xff1f; 因为系统资源不希望被用户随意访问&#xff0c;可能造成各种意想不到的错误&#xff0c;…

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC&#xff08;麦克风&#xff09;接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座&#xff0c;图一 为连接4节的音频座&#xff0c;而且有两个开关&#xff0c;1接地&#xff0c;2接MIC&#xff0c;3接左声…

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…

计算机网络•自顶向下方法:网络应用原理

网络应用原理 网络应用架构 目前有两种主流的网络应用架构&#xff1a; 客户-服务器架构&#xff08;Client-server&#xff09; 服务器&#xff08;server&#xff09;: 有一台总是在线的主机&#xff0c;上面运行着服务器程序(server)服务器主机(server machine)具有永久的…

net.eval()和net.trasin()的用法

当构建神经网络使用到dropout层等时&#xff0c;网络的正向传播后反向传播神经元的系数会有所不同&#xff0c;因此需要用.eval()和.train()来指定模型方向。 net.train() 作用&#xff1a;将模型设置为训练模式。影响&#xff1a; 启用 Dropout 层&#xff1a;Dropout 会随机…

数据结构与算法-目录

音视频流媒体开发-目录 iOS知识点-目录 Android-目录 Flutter-目录 数据结构与算法-目录 恋上数据结构与算法一 【恋上数据结构与算法一】(一)复杂度 【恋上数据结构与算法一】(二)动态数组 【恋上数据结构与算法一】(三)链表 【恋上数据结构与算法一】(四)栈 【恋上数据结构与…