leetcode刷题(3): 动态规划

ops/2024/12/22 2:54:34/

文章目录

    • 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.ppmy.cn/ops/31613.html

相关文章

VitePress 构建的博客如何部署到 Netlify 平台?

VitePress 构建的博客如何部署到 Netlify 平台&#xff1f; 前言 之前写了篇文章【使用 Vitepress 构建博客并部署到 github 平台】&#xff0c;有个老哥说 github page 访问太慢了&#xff0c;希望放到 Netlify 平台上面。 咱也没部署过&#xff0c;就试了一下&#xff0c;发…

面试经典150题——判断子序列

面试经典150题 day26 题目来源我的题解方法一 双指针方法二 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;392 我的题解 方法一 双指针 分别使用一个指针控制两个字符串的遍历&#xff0c;当两个指针的位置的字符相同时&#xff0c;同时移动两个指针&#xf…

vue的action与mutation 的区别

在 Vue.js 的状态管理库 Vuex 中&#xff0c;mutations 和 actions 都是用于更改状态的方法&#xff0c;但它们之间存在一些重要的区别。下面我将通过举例来说明这些区别&#xff1a; 1. 基本定义 mutations&#xff1a;用于直接修改状态&#xff08;state&#xff09;。它们是…

JavaScript 简单类型与复杂类型

一、简单类型与复杂类型 简单类型又叫做基本数据类型或者值类型&#xff0c;复杂类型又叫做引用类型 值类型&#xff1a;简单数据类型&#xff0c;在存储时变量中存储的是值本身&#xff0c;因此叫做值类型 string number boolean undefined null 返回的是空的对象 ob…

Windows设置Redis为开机自启动

前言 Redis作为当前最常用的当前缓存技术&#xff0c;基本上Web应用中都有使用。所以&#xff0c;每次我们在本地启动项目前&#xff0c;都必须将Redis服务端启动。但是&#xff0c;每次都要去启动Redis就很麻烦&#xff0c;有没有办法做到开机自动启动Redis呢&#xff1f;这当…

SDB2F5 1.5A,高达28V输出1.2MHz升压转换器芯片IC

一般说明 该SDB2F5是一个恒定的频率&#xff0c;5针SOT23电流模式升压转换器&#xff0c;低功耗应用。SDB2F5交换机位于1.2MHz&#xff0c;并允许使用高度小于或等于2mm的微小、低成本电容器和电感器。内部软启动的结果在小浪涌电流和延长电池寿命。 该SDB2F5操作从一个…

AWTK 和 QT 资源占用不完全对比

因为没有开发两个完全一样的应用程序&#xff0c;对比的结果并不是很准确&#xff0c;仅供参考。 对比的程序为&#xff1a; AWTK demoui 演示了 AWTK 常用功能。 QT QDesktop 演示了 QT 常用功能。 运行平台为&#xff1a; i.MX6ULL Linux 1. 可以执行文件大小 1.1 AWTK…

商城系统推荐,如何找到一款可靠的商城系统?

如今&#xff0c;电商系统成为商家必不可少的营销工具&#xff0c;其系统在金融、外贸、零售等行业领域应用广泛。那么&#xff0c;作为初试水的企业又没有挑选电商系统的经验&#xff0c;如何找到拥有全功能、全渠道、可靠的网上商城系统呢&#xff1f; 我们可以先按电商系统…