leetcode刷题(3): 动态规划

文章目录

    • 42. 接雨水
      • 解题思路
      • c++ 实现
    • 64. 最小路径和
      • 解题思路
      • c++ 实现
    • 62 不同路径
      • 解题思路
      • c++ 实现

42. 接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:

在这里插入图片描述

解题思路

  • 使用动态规划(DP)方法求解
  • 当前位置接水体积计算公式: m i n ( L e f t m a x , R i g h t m a x ) − C u r r H e i g h t min(Left_{max},Right_{max})-CurrHeight min(Leftmax,Rightmax)CurrHeight
  • 从左到右遍历数组得到每个位置左边柱子高度的最大值 L e f t m a x Left_{max} Leftmax;从右到左遍历数组得到每个位置所有右边柱子高度的最大值 R i g h t m a x Right_{max} Rightmax
    在这里插入图片描述
  • 根据得到的每个位置的 L e f t m a x Left_{max} Leftmax R i g h t m a x Right_{max} Rightmax, 利用积水量计算公式
    在这里插入图片描述
    如上图黄色标识位置所示:min(leftmax,rightmax)=min(1,3)1,此时柱子高度为1。所以盛水体积为1。下一个位置 min(leftmax,rightmax)=min(1,3)=1, 此时柱子高度height为0, 根据:min(leftmax,rightmax)-height =1, 此处盛水体积为1

c++ 实现

class Solution {
public:int trap(vector<int>& height) {int n = height.size();if (n == 0) {return 0;}vector<int> leftMax(n);leftMax[0] = height[0];for (int i = 1; i < n; ++i) {leftMax[i] = max(leftMax[i - 1], height[i]);}vector<int> rightMax(n);rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; i--) {rightMax[i] = max(rightMax[i + 1], height[i]);}int ans = 0;for (int i = 0; i < n; i++) {ans += min(leftMax[i], rightMax[i]) - height[i];}return ans;}
};

64. 最小路径和

题目: 给定一个包含非负整数m x n 网格 grid,请找出一条从左上角右下角的路径,使得路径上的数字总和最小

说明:每次只能向下或者向右移动一步。

示例:

在这里插入图片描述

解题思路

  • 假设dp[i][j]为从起点(左上角点)到grid[i][j]的路径的总数字之和
  • 由于每次只能向下或者向右移动,那么dp[i][j]就有:
// 从前一步dp[i-1][j]向下移动grid[i,j]
dp[i][j]=dp[i-1][j] +grid[i][j]
// 或者
//从前一步dp[i][j-1]向右移动grid[i,j]
dp[i][j] = dp[i][j-1]+grid[i][j]
  • 此时,每个格子最小取值只能在该格子左端的格子和上端的格子的最小值中取其一公式表示为:dp[i][j] = min(dp[i-1][j] +grid[i][j],dp[i][j-1]+grid[i][j]),根据该公式即可求解

c++ 实现

class Solution {
public:int dp[300][300];int minPathSum(vector<vector<int>>& grid) {memset(dp,0x3f,sizeof(dp));dp[0][0] = grid[0][0];int n = grid.size();int m = grid[0].size();for(int i = 0; i < grid.size();i++){for(int j = 0; j < grid[0].size();j++){if(j-1 >=0)dp[i][j] = min(dp[i][j],dp[i][j-1]+grid[i][j]);   if(i-1>=0)dp[i][j] = min(dp[i][j],dp[i-1][j]+grid[i][j]);}}return dp[n-1][m-1];}
};
  • 由于 1=<m,n<=200, 因此初始化dp[300][300],空间是足够的
  • 初始化dp, 由于我们求的是最小值,所以初始化dp为最大值;注意一定要memset(dp,0x3f,sizeof(dp));使用INT_MAX以及1000来初始化结果都出错,可能是会造成Int越界把
  • 根据公式dp[i][j] = min(dp[i-1][j] +grid[i][j],dp[i][j-1]+grid[i][j]),所以需要对比向右向下两种情况,取其中最小的。其中当i=0, 此时dp[i][j],只能由dp[i][j-1]向右移动一步;同理当j=0, 此时dp[i][j], 只能由dp[i-1][j]向下移动一步。所以有:
  for(int i = 0; i < grid.size();i++){for(int j = 0; j < grid[0].size();j++){if(j-1 >=0)dp[i][j] = min(dp[i][j],dp[i][j-1]+grid[i][j]);   if(i-1>=0)dp[i][j] = min(dp[i][j],dp[i-1][j]+grid[i][j]);}}
  • 最后返回从左上角到右下角的值: dp[n-1][m-1]

62 不同路径

题目:一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

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

示例:
在这里插入图片描述

解题思路

  • 由于机器人只能向下向右走,因此达到指定格子的最后一步,要么是向下要么是向右到达。
  • 假设dp[i][j] 表示第i行j列能达到的方案数目,就有 dp[i][j] = dp[i-1][j] + dp[i][j-1](), 即到达指定格子的路径数目就等于到达相邻的上方和左方的两个格子的路径数目之和

在这里插入图片描述

c++ 实现

class Solution {
public:int uniquePaths(int m, int n) {int dp[110][110];memset(dp,0,sizeof(dp));dp[0][0] =1;for (int i=0;i<m;i++){for(int j=0;j<n;j++){if(i>0)dp[i][j] += dp[i-1][j];if (j>0)dp[i][j] += dp[i][j-1];}}return dp[m-1][n-1];}
};
  • 对于 i>0j>0 ,此时到达第i行j列能的方案数目为: dp[i][j] = dp[i-1][j] +dp[i][j-1]
  • 但对于i =0这种情况,只能通过向右移动到达第i行j列,此时该方案数目为: dp[i][j] = dp[i][j-1]; 同理对于j=0时,只能通过向下移动到达第i行j列, 此时该方案数目为:dp[i][j] = dp[i-1][j];因此代码有如下代码:
 for (int i=0;i<m;i++){for(int j=0;j<n;j++){if(i>0)dp[i][j] += dp[i-1][j];if (j>0)dp[i][j] += dp[i][j-1];}}

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

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

相关文章

大功率双向直流电源的输出电压和电流

双向直流电源&#xff08;Bidirectional DC Power Supply&#xff09;是一种具有双向输出电能的直流电源。与传统的直流电源相比&#xff0c;双向直流电源在输出电能的同时&#xff0c;还具备一定的电流输入能力&#xff0c;从而使其应用范围更加广泛。大功率双向直流电源作为电…

言语 目录

List item List item List item

【业务场景】京东实际场景,频繁GC引起的CPU飙高问题的解决

目录 1.业务介绍 2.判断任务类型 3.CPU飙高的原因 1.业务介绍 本文的业务场景是京东零售线公开的一篇文章&#xff0c;文章内容详细介绍了京东零售线如何将广告相关的定时任务从半小时优化到秒级的&#xff0c;原文链接&#xff1a; 半小时到秒级&#xff0c;京东零售定时…

USP技术提升大语言模型的零样本学习能力

大语言模型&#xff08;LLMs&#xff09;在零样本和少样本学习能力上取得了显著进展&#xff0c;这通常通过上下文学习&#xff08;in-context learning, ICL&#xff09;和提示&#xff08;prompting&#xff09;来实现。然而&#xff0c;零样本性能通常较弱&#xff0c;因为缺…

数据库(MySQL)—— 事务

数据库&#xff08;MySQL&#xff09;—— 事务 什么是事务事务操作未控制事务测试异常情况 控制事务一查看/设置事务提交方式&#xff1a;提交事务回滚事务 控制事务二开启事务提交事务回滚事务 并发事务问题脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non…

【热门话题】如何构建具有高度扩展性的系统

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 如何构建具有高度扩展性的系统引言一、理解扩展性1.1 扩展性的定义1.2 扩展性的…

嵌入式单片机中必会的50个电路分享

单片机 电源 声音模块 收音机 485

微软如何打造数字零售力航母系列科普08 - Yobe 如何联手微软Azure,安全使用客户数据,预测客户购买行为?

Yobe 如何联手Azure&#xff0c;安全使用客户数据&#xff0c;预测客户购买行为&#xff1f; 在当今数据驱动的世界中&#xff0c;了解客户行为并有能力通过数据和分析预测客户意图是企业保持竞争力所应具备的首要优势。Yobi由Max Snow、Bill Wise和Tom Griffiths于2019年创立&…

vivado Aurora 8B/10B IP核(12)- Setp By Step搭建FPGA工程

Step1:任意创建一个新的空的工程&#xff08;创建工程的具体工程如果还不清楚的看我们教程第一季部分&#xff09;&#xff0c; 并且进入IP CORE列表 右击Customize ip Step2:配置 IP CORE-Core options Step3:配置 IP CORE-GT Selections Step4:配置 IP CORE-Shared Logic 为 …

力扣刷题1

第一次刷Leetcode&#xff01;这个系列会已知更新下去的&#xff01; 由于作者太废&#xff0c;所以只能先更&#xff1a;【新】动计划---编程入门 题目简单 &#xff0c;不愧是第一题&#xff01;这题考察的是函数的返回值。 ACcode : class Solution { public:int sum(int n…

机器学习笔记-20

处理大数据集的算法 1. 随机梯度下降 我们之前一直在学的梯度下降算法也叫Batch梯度下降算法&#xff0c;前面的笔记有提过一嘴。以线性回归为例子&#xff0c;随机梯度下降也适用于其他使用Batch梯度下降算法求参数的学习算法&#xff0c;随机梯度下降是对Batch梯度下降算法的…

生成树协议(STP,MSTP,RSTP)详解

目录 STP生成树协议 二层环路出现的原因&#xff1a; 二层环路引发的危害&#xff1a; stp生成树防环的基本思路&#xff1a; 802.1D生成树协议&#xff1a; 配置BPDU的报文结构&#xff1a; 配置BPDU中某些字段的解析&#xff1a; TCN BPDU报文格式&#xff1a; stp中…

LabVIEW鸡蛋品质智能分级系统

LabVIEW鸡蛋品质智能分级系统 随着现代农业技术的飞速发展&#xff0c;精确、高效的农产品质量控制已成为行业的重要需求。其中&#xff0c;鸡蛋作为日常膳食中不可或缺的重要组成部分&#xff0c;其品质直接关系到消费者的健康与满意度。本文设计并实现了一套基于LabVIEW的鸡…

3.3Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用-Vue组合式API

为什么要使用Composition API 一个Options API实例 在前面的课程中&#xff0c;我们都是采用 Options API&#xff08;基于选项的 API &#xff09; 来写一个组件的。下面是一个实例&#xff1a; <template> Count is: {{ count }}, doubleCount is: {{ doubleCount…

二、Linux系统安装

章节目标 Linux发展史掌握虚拟机软件安装新建虚拟机以及CentOS系统安装了解VMware备份的两种方式、能说出快照与克隆的区别 一、Linux发展史 1. Linux 起源 Linus(林纳斯托瓦兹)&#xff1a;Linux 的开发作者&#xff0c;被称为Linux 之父&#xff0c;Linux 诞生时是芬兰赫…

PR2019软件下载教程

打开下载网址&#xff1a;rjctx.com 选择Premiere&#xff1a; 选择PR2019&#xff0c;并点击&#xff1a; 拉到最后&#xff0c;选择百度网盘下载&#xff1a; 下载到本地。 二&#xff0c;软件安装 解压缩后&#xff0c;双击set_up 选择位置后&#xff0c;进行安装&…

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

数字逻辑之“逻辑门电路”

一、基础知识 1、正逻辑和负逻辑 &#xff08;1&#xff09;基本的逻辑规定 1——“真”0——“假” &#xff08;2&#xff09;正逻辑和负逻辑 在实际的数字系统中&#xff0c;用数字信号&#xff08;逻辑电平U1&#xff0c;U2&#xff09;表示“真&#xff08;1&#xf…

用LangChain打造一个可以管理日程的小助手

存储设计定义工具创建llm提示词模板创建Agent执行总结 众所周知&#xff0c;GPT可以认为是一个离线的软件的&#xff0c;对于一些实时性有要求的功能是完全不行&#xff0c;比如实时信息检索&#xff0c;再比如我们今天要实现个一个日程管理的功能&#xff0c;这个功能你纯依赖…

安卓 app icon大小 安卓app界面尺寸大小

移动应用的界面设计画布尺寸设计多大&#xff08;特别是Android&#xff09;、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现&#xff1f; 本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索&#xff0c;来分享移动应用界面设计中的…