代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零

前言 : 动规五部曲

理论基础  : 代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客

1.明白dp数组的含义

2.明白递推公式的含义

3.初始化dp数组

4.注意dp数组的遍历顺序

5.打印dp数组排错

LeetCode T1049 最后一块石头的重量II

题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)

题目思路:

这题我们仍然采用动规五部曲来写,这题和昨天的那一道分割等和子集类似,我们先对数组求和得到sum,然后取其的一半+1作为dp数组的大小,最后我们只需要求得sum/2作为容量的背包能装的最大容量,用sum减去两倍的dp[sum/2]即可,有人问为什么这样做,我举个例子

为什么要减去两倍的dp[sum/2]呢,其实就是求两边到中间的距离的,因为是左边和右边所以减了两次

想明白了这个,我们开始使用动规五部曲来操作了

1.明白dp数组的含义

dp[j]的含义仍然是j容量的背包能装的最大价值,这里的最大价值也就是最大重量了

2.明白递推公式的含义

这里的stones的价值和重量是相等的

dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[j])

有人始终不明白这里的dp[j]后面为什么求dp[j]和dp[j-stones[i]]+stones[j]的最大值,为啥跟自己求最大值,其实这里后面的dp[j]还保存了上一层的dp[j]的大小,因为没有被更新过,所以其实不是跟自己比

3.初始化dp数组

这里因为石头的重量都是大于0的,我们全部初始化为0即可

4.注意dp数组的遍历顺序

先遍历物品,后遍历背包即可,不明白的看我的上一篇博客

代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客

5.打印dp数组排错

如果遇到所求不符合了,可以去idea打印出数组来查看,这里建议使用二维数组的方式查看,更加直观

题目代码:(一维数组版本)

class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for(int i: stones){sum+=i;}int  target = sum/2;int[] dp = new int[target+1];for(int i = 0;i<stones.length;i++){for(int j = target;j>=stones[i];j--){dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);}}return sum-dp[target]-dp[target];}
}

题目代码:(二维数组版本)

class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for(int i: stones){sum+=i;}int  target = sum/2;int[][] dp = new int[stones.length][target+1];for(int i = stones[0];i<=target;i++){dp[0][i] = stones[0];}for(int i = 1;i<stones.length;i++){for(int j = 1;j<=target;j++){//不放if(j<stones[i]){dp[i][j] = dp[i-1][j];}//放else{dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-stones[i]]+stones[i]);}}}return sum-dp[stones.length-1][target]*2;}
}

LeetCode T494 目标和

题目链接:494. 目标和 - 力扣(LeetCode)

题目思路:

我们也将数组按正负号划分为两个阵营,此时我们是不是只需要求一边的结果,另一边自然而然就确定了,所以这道题我们就有这样两个表达式

left//表示正的阵营
right//表示负的阵营
left + right = sum
left - right = target
left = (target+sum)/2

这里我们就知道了背包的容量为left的大小对应的表达式

这里如果我们的所求target>sum或者小于-sum都是不可能达成的

还有如果遇见target和sum的和为奇数也是不可能的,直接返回0,这是因为奇数/2是向下取整的,举个例子:

假如我的nums是[1,1,1,1,1],要求得到2

这里left明显等于3

而三个1加上两个-1得到是1,并不符合题意,实际上这个选择是无解的

接下来我们继续按照动规五部曲来走一遍

1.明白dp数组的含义

这里的dp[j]表示,容量为j的背包装满有多少种方法

2.明白递推公式的含义

dp[j] +=dp[j-nums[i]]

因为这里要求方法有多少种,举个例子

dp[5] = dp[4] + 1 其实和斐波那契数列和爬楼梯有点类似,可以相成到达5的方法数就是4的方法数+后面nums[j-nums[i]]的方法数

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
  • 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
  • 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
  • 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包
  • 实际上求dp[5],就是把他们都累加起来

3.初始化dp数组

这里初始化dp[0] = 1,我们不要根据字面关系去理解,直接带入上面的公式理解

left = (target+sum)/2,此时left = 0,这就是一种方法

所以dp[0]要初始化为1而不是0,因为后面都得靠dp[0]推导出来,如果它为0后面的结果都是0

4.注意dp数组的遍历顺序

先遍历物品,后遍历背包

5.打印dp数组排错

题目代码:

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;for(int i:nums){sum += i;}if(target>sum || target<-sum){return 0;}if((target + sum) % 2 == 1){return 0;}int bagSize = (target+sum)/2;int[] dp = new int[bagSize+1];dp[0] = 1;for(int i = 0;i<nums.length;i++){for(int j=bagSize;j>=nums[i];j--){dp[j] += dp[j-nums[i]];}}return dp[bagSize];}
}

LeetCode T474 一和零

题目链接:474. 一和零 - 力扣(LeetCode)

题目思路:

这道题也是一个背包问题,虽然有点抽象,下面我们开始用动规五部曲来分析

1.明白dp数组的含义

这里的dp数组的含义就是m个0和n个1能包含的最大子集,也就是能装下m个0和n个1的背包能存放的最大物品数

2.明白递推公式的含义

我们从最初的0-1背包开始递推

dp[j] = Math.max(dp[j],dp[j - weight[i]]+value[i])

这里我们的重量其实就是i和j的个数,我们使用x代表这个物品中的'0'的个数,y代表1的个数

那么此时就转换成了

dp[i][j] = Math.max(dp[i][j],dp[i-x][j-y]+1)

因为此时如果能放进去,也就是加了1个物品

3.初始化dp数组

此时dp[0][0] 很轻易就能知道是0,为了我们的递推公式能顺利的覆盖结果,其他的也初始化为0

4.注意dp数组的遍历顺序

和之前一样,先遍历物品,再遍历背包即可

5.打印dp数组排错

题目代码:

class Solution {public int findMaxForm(String[] strs, int m, int n) {//dp数组含义int[][] dp = new int[m+1][n+1];//初始化,全为0for(String s:strs){int x = 0,y = 0;for(char c:s.toCharArray()){if(c == '0'){x++;}else{y++;}}for(int i = m;i>=x;i--){for(int j = n;j>=y;j--){dp[i][j] = Math.max(dp[i][j],dp[i-x][j-y]+1);}}}return dp[m][n];}
}

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

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

相关文章

多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术水平

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 点击查看原文链接https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247546998&idx6&sn39342c376b158eff1…

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法&#xff0c;亲测有效&#xff1a; Mobax好卡啊&#xff0c;那就直接在阿里云后台操作即可&#xff0c;阿里云后台也可以上传文件。 Navicat mysql好卡啊&#xff0c;那就直接在阿里云后台最上面帮助的右边有个数据库&…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示&#xff0c;RAG为LLM提供了有用的上下文&#xff0c;以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

stable-diffusion 电商领域prompt测评集合

和GhostReivew一个思路&#xff0c;还是从比较好的图片或者是civitai上找一些热门的prompt&#xff0c;从小红书上也找到了不少的prompt&#xff0c;lexica.art上也有不少&#xff0c;主要是为了电商场景的一些测评&#xff1a; 小红书、civitai、Lexica、Liblib.ai、 depth o…

excel制作透视表

场景描述&#xff1a; 有一张excel表&#xff0c;存在多条记录&#xff0c;现在需要把相同名称的商品的数量求和&#xff0c;放在一起展示 操作步骤&#xff1a; 删除最后一行数据 选中不显示分类汇总 以表格形式展示

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

黄仁勋:英伟达预言 2 年内行业将面目全非 一个词形容AI:Unbelievable

本心、输入输出、结果 文章目录 黄仁勋&#xff1a;英伟达预言 2 年内行业将面目全非 一个词形容AI&#xff1a;Unbelievable前言【访谈内容】一个词形容AI&#xff1a;Unbelievable创立英伟达“比想象中难一百万倍”相关图片传送门弘扬爱国精神 黄仁勋&#xff1a;英伟达预言 …

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成&#xff0c;可以将其理解为智能手机的屏幕。 增强现实&#xff0c;从本质上说&#xff0c;是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

Temp directory ‘C:\WINDOWS\TEMP‘ does not exist

问题描述 解决方法 管理员权限问题&#xff0c;进入temp文件夹更改访问权限即可。 点击 temp文件夹 属性 -> 安全 -> 高级 -> 更改主体Users权限 给读取和写入权限 参考博客 开发springboot项目时无法启动Temp directory ‘C: \WINDOWS\TEMP‘ does not exist

Python武器库开发-常用模块之configparser模块(十六)

configparser模块(十六) ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类&#xff0c;该模块的作用就是用来读取配置文件的&#xff0c;使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法&#xff0c;创建一个…

Github 自动化部署到GitHub Pages

1.准备工作 新建仓库 新建项目 配置 vite.config.ts base: ./,部署应用包时的基本URL&#xff0c;例&#xff1a;vue-cli 5.x 配置 publicPath 推送到远程仓库 2.配置 GitHub Token 点击 Settings -> Actions -> General 找到 Workflow permissions&#xff0c;选中第…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具&#xff0c;可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数&#xff0c;以获得更好的视觉体验。此外&#xff0c;BetterDisplay Pro还提供了一些额外的功能&#xff0c;如屏幕分割、窗口管理、快捷键…

vivo发布“蓝心千询”自然语言对话机器人

&#x1f989; AI新闻 &#x1f680; vivo发布“蓝心千询”自然语言对话机器人 摘要&#xff1a;vivo今日发布了“蓝心千询”自然语言对话机器人&#xff0c;基于蓝心大模型。蓝心千询可以进行知识信息的快速问答&#xff0c;文学创作、图片生成&#xff0c;甚至还能编写程序…

✔ ★【备战实习(面经+项目+算法)】 11.3学习

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

[GitLab] 安装Git 指定版本

卸载旧版本 检查是否已经安装 git --version如果已经安装&#xff0c;先卸载 yum -y remove git安装新版本 在GitHub上选择需要下载的版本 Git版本 在/usr/local/目录下新建文件夹&#xff1a;git&#xff0c;并在/usr/local/git/文件夹内下载压缩包 wget https://github…

串口通信代码整合1

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

【Redis】String字符串类型-内部编码使用场景

文章目录 内部编码使用场景缓存功能计数功能共享会话手机验证码 内部编码 字符串类型的内部编码有3种&#xff1a; int&#xff1a;8个字节&#xff08;64位&#xff09;的⻓整型&#xff0c;存储整数embstr&#xff1a;压缩字符串&#xff0c;适用于表示较短的字符串raw&…

JavaScript:事件循环机制(EventLoop)

一、理解进程、线程 进程是操作系统中的基本概念之一&#xff0c;指的是一个正在运行中的程序&#xff0c;包括了程序的执行代码、数据、资源等。操作系统为每个进程分配一定的系统资源&#xff0c;例如内存空间、文件和设备等&#xff0c;以便进程能够正常运行。 线程是进程…

coalesce函数(SQL )

用途&#xff1a; 将控制替换成其他值&#xff1b;返回第一个非空值 表达式 COALESCE是一个函数&#xff0c; (expression_1, expression_2, …,expression_n)依次参考各参数表达式&#xff0c;遇到非null值即停止并返回该值。如果所有的表达式都是空值&#xff0c;最终将返…

【计算系统】5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别

5分钟了解超算&#xff0c;高性能计算&#xff0c;并行计算&#xff0c;分布式计算&#xff0c;网格计算&#xff0c;集群计算以及云计算的区别 1. 超算2. 高性能计算3. 并行计算4. 分布式计算5. 网格计算6. 集群计算7. 云计算小结相关资料 1. 超算 超级计算机&#xff08;Sup…