LeetCode刷题笔记【33】:动态规划专题-5(最后一块石头的重量 II、目标和、一和零)

文章目录

  • 前置知识
  • 1049. 最后一块石头的重量 II
    • 题目描述
    • 解题思路
    • 代码
  • 494. 目标和
    • 题目描述
    • 用回溯算法
    • 转换为背包问题动态规划
  • 474.一和零
    • 题目描述
    • 解题思路
    • 代码
  • 总结

前置知识

今天是动态规划专题的第5篇, 也是背包问题的第2篇.
所以本文和动态规划专题的1~3弱相关, 和上一篇, 也就是动态规划-4强相关.

相比于昨天的经典背包问题的思路与模板, 今天侧重于如何将其他问题理解为背包问题, 并且如何对具体的情景进行调整.
并且今天的三道题都是广义的"01背包问题", 即"物品只有选择/不选择两种情况".

参考文章:
LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)
LeetCode刷题笔记【30】:动态规划专题-2(不同路径、不同路径 II)
LeetCode刷题笔记【31】:动态规划专题-3(整数拆分、不同的二叉搜索树)
LeetCode刷题笔记【32】:动态规划专题-4(二维背包问题、一维背包问题、分割等和子集)

1049. 最后一块石头的重量 II

题目描述

在这里插入图片描述

LeetCode链接:https://leetcode.cn/problems/last-stone-weight-ii/description/

解题思路

参考昨天最后一题<416. 分割等和子集>, 昨天是要我们选出两组数, 然后让两组数的和相同;
今天是让我们选出一对儿一对儿的石头, 互相碰, 让最后剩下的石头最小; (看似差别较大)

但其实可以转化为:“选出两组石头, 让两组石头互相碰, 从而让剩下的结果最小

这样一来, 就可以使用和<416. 分割等和子集>一样的思路, 先求sum, 然后将sum/2作为bagSize(target), 使用背包问题的过程, 从而求得dp[target]的值, 也就是"面对target这么大的背包, 我们最多能装多少石头".

唯一需要注意的是, 最后的结果应该是 sum-2*dp[target], 因为是求剩下了多少石头嘛.

代码

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

494. 目标和

题目描述

截图

LeetCode链接:https://leetcode.cn/problems/target-sum/description/

用回溯算法

① 回溯遍历穷举(虽然时间复杂度非常高, 但是高低是通过了)

class Solution {
private:int ans=0;int curSum=0;void backtrack(vector<int>& nums, int target, int index){if(index>=nums.size()){if(curSum==target)ans++;return;}curSum += nums[index];backtrack(nums, target, index+1);curSum -= nums[index]*2;backtrack(nums, target, index+1);curSum += nums[index];return;}
public:int findTargetSumWays(vector<int>& nums, int target) {backtrack(nums, target, 0);return ans;}
};

转换为背包问题动态规划

② 转换为背包问题, 动态规划
既然最后可以得到target, 那么一定可以将所有数分为leftright两组, 有如下关系:
left+right=sum, left-right=terget
推导得到: left = (sum+target)/2, 这样一来, 问题就转化为"nums中有多少种数字组合, 可以让和为(sum+target)/2"

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int num : nums)sum += num;if(abs(target)>sum)return 0;if((sum+target)%2==1)return 0;int left = (sum+target)/2;vector<int> dp(left+1, 0);dp[0] = 1;for(int i=0; i<nums.size(); ++i){for(int j=left; j>=nums[i]; --j){dp[j] += dp[j-nums[i]];}}return dp[left];}
};

这还有一个问题, 就是关于递推公式为什么是dp[j] += dp[j-nums[i]];
其实写成 dp[j] = dp[j] + dp[j-nums[i]] 更方便理解, 解释起来就是:
① 现在的背包容量是j
② 一方面之前还没有物品i的时候, 我有dp[i]种将容量为j的背包装满的方法(上一行中的内容)
③ 现在有了物品i, 其重量是nums[i], 那么此时的装满背包的方法, 一方面要考虑原有的dp[i], 还要考虑装入物品i后, 装满剩余空间的方法数量(dp[j-nums[i]])

所以面对容量为j的背包, 和0~i种物品, 有dp[j] = dp[j] + dp[j-nums[i]]种装包方法

在这里插入图片描述
如果将一维dp数组展开成二维, 展现其更新推导过程, 则如上图所示

还有一个点是关于初始化, 为什么要让dp[0]=1, 我的理解是对于容量为0的背包, 你手上一个物品都没有(0个物品), 那么你就只有1种方法: 啥都不装. 所以为1.

474.一和零

题目描述

截图

LeetCode链接:xxx(记得加点击跳转链接)

解题思路

<代>: 其实还是01背包问题, 但此时背包中有两个bagSize的维度
递推公式是: dp[i][j] = max(dp[i][j], dp[i-zeroNum][i-oneNum]+1)
其中zeroNumoneNum当前0和1的数量

代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for(string str : strs){int zeroNum = 0, oneNum = 0;for(int c : str){if(c=='0')zeroNum++;elseoneNum++;}for(int i=m; i>=zeroNum; --i){for(int j=n; j>=oneNum; --j){dp[i][j] = max(dp[i][j], dp[i-zeroNum][j-oneNum]+1);}}}return dp[m][n];}
};

总结

简单01背包问题分割等和子串最后一块石头的重量目标和
问什么问题面对大小为bagSize的背包和n件物品, 怎么装收益最大面对大小为sum/2的背包, 用nums中的num作为物品, 能不能将背包装满面对sum/2的背包, 我用这些石头尽量多装, 剩下的空间最少是多少面对大小为(sum+target)/2的背包, 我用nums中的num作为物品来装满它, 有几种装法?
背包大小bagSizetarget=sum/2target=sum/2left=(sum+target)/2
是否要装满不一定需要, 否则返回false不一定, 求最少剩下多少空间一定
返回结果最大收益dp.back() / dp.(bagSize)装满了(dp[target]==target, 则true)/没装满(dp[target]!=target, 则false)sum-2*dp[target]dp[left]
dp数组的含义背包大小j, 有0~i物品, 最大收益同左, 但weightvalue都用nums代替同左左, 但stones同时担任weightvalue的作用背包大小j, 有0~i物品, 装满背包的方法数量
递推公式dp[j]=max(dp[j], value[i]+dp[j-weight[i]])dp[j]=max(dp[j], nums[i]+dp[j-nums[i]])dp[j]=max(dp[j], stones[i]+dp[j-stones[i]])dp[j] = dp[j]+dp[j-nums[i]]
trick二维换一维, 偷空间复杂度sum%2==1了直接return false和左右两边需要检测奇数偶数不同, 虽然这里也有target=sum/2, 但可以直接用int性质向下取整sum%2==1 或者 (sum+target)%2==1了直接return false
备注遇到其他问题想不出来了, 就往这个经典问题上靠, 甚至别强求一维背包, 画一下二维背包帮助理解类似于右value数组和weight数组意义重合, 二者的功能被stones数组同时担任可以看出和前三个几乎不是一卦的, 要注意区分, 以及理解递推公式

本文参考:
最后一块石头的重量 II
目标和
一和零

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

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

相关文章

Prometheus-PushGateway自定义监控项

文章目录 一、前言二、PushGateway安装三、PushGateway的使用四、PushGateway脚本思路 一、前言 pushgateway相比较exporter是主动向服务器发送请求&#xff0c;pushgateway本身也是一个程序&#xff0c;可以运行在任意节点上(不是必须在被监控端)&#xff0c;运行本身没有抓取…

项目:TCP在线云词典

一.要求 1.搭建的框架环境中实现并发&#xff0c;实现多个用户同时查询的功能。 2.服务器分别保存每个用户的使用记录&#xff0c;客户端可以查询日志的功能。 3.基本的查询单词的功能。 4.密码验证的功能&#xff0c;实现登录验证账号和密码是否正确。 二.流程和框架 框架 …

【Python+selenium】生成测试报告

批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导入HTMLT…

蓝牙技术|多快好省的苹果Find My查找定位方案商:北京自在科技

在电子市场里&#xff0c;各种蓝牙定位器品牌争奇斗艳&#xff0c;例如国外的Tile Mate 和 Slim&#xff0c;三星的 Galaxy SmartTag 和 Galaxy SmartTag&#xff0c;Chipolo 的ONE Spot&#xff0c;还有苹果的 AirTag 等等。而国内也有着不少优秀的品牌&#xff0c;如Nutale的…

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预…

python抠图(去水印)开源库lama-cleaner入门应用实践

1. 关于 Lama Cleaner Lama Cleaner 是由 SOTA AI 模型提供支持的免费开源图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人&#xff0c;或者擦除并替换&#xff08;powered by stable diffusion&#xff09;图片上的任何东西。 特征&#xff1a; 完全免费开源&am…

YOLO物体检测-系列教程2:YOLOV2整体解读

&#x1f388;&#x1f388;&#x1f388;YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV2提出论文&#xff1a;YOLO9000: Better, Faster, Stronger 1、YOLOV1 优点&#xff1a;快速&#xff0c;简单&#xff01;问题1&#xff1a;每个Cell只预测一个类别&…

ros----发布者和订阅者模型

话题模型&#xff1a; 如何自定义话题消息 1.定义msg文件 2.在package.xml中添加功能包依赖 <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>3.在CMakeList.txt文件中添加编译选项 4.编译生成语言的相…

医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目&#xff0c;主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势&#xff1a; 支持多个版本的 Python提供验证码本地识别功能可…

企业架构LNMP学习笔记46

PHP测试连接代码&#xff1a; php代码测试使用memcached&#xff1a; 示例代码&#xff1a; <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…

AUTOSAR通信篇 - CAN网络通信(五:ComM)

文章目录 模块交互EcuM交互BswM交互NvM交互CanSM交互NM交互 ComM功能Paritial Network Cluster 管理Partial Network Cluster 管理功能ComM PNC状态机在主状态COMM_PNC_NO_COMMUNICATION中PNC的行为PNC网关相关的要求 从断电进入PNC主状态COMM_PNC_NO_COMMUNICATION时在主状态C…

深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数

在MySQL数据库中&#xff0c;JSON格式的数据处理已经变得越来越常见。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数&#xff0c;其中两个关键的函数是…

SpringBoot实战(二十四)集成 LoadBalancer

目录 一、简介1.定义2.取代 Ribbon3.主要特点与功能4.LoadBalancer 和 OpenFeign 的关系 二、使用场景一&#xff1a;Eureka LoadBalancer服务A&#xff1a;loadbalancer-consumer 消费者1.Maven依赖2.application.yml配置3.RestTemplateConfig.java4.DemoController.java 服务…

笔记01:第一行Python

NameError 名字不含特殊符号&#xff08;只能是英文、数字、下划线、中文等&#xff09;名字区分大小写名字先定义后使用 SyntaxError 不符合Python语法书写规范除了语法成分中的保留拼写错误输出中文符号if、for、def等语句末尾忘记冒号 IdentationError 缩进错误&#x…

C# Onnx Yolov8 Detect 物体检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

开源即时通讯(IM)项目OpenIM源码部署流程

由于OpenIM依赖的组件较多&#xff0c;开发者需求不一&#xff0c;导致OpenIM部署一直被人诟病&#xff0c;经过几次迭代优化&#xff0c;包括依赖的组件compose的一键部署&#xff0c;环境变量设置一次&#xff0c;全局生效&#xff0c;以及脚本重构&#xff0c;目前OpenIM部署…

2023CSP游寄

初赛 DAY -2 才刚考开学测就来初赛。 复赛之后就是月测&#xff0c;这就是初三吗。 初中最后一次 CSP&#xff0c;如果 S 没一等就得摆烂了。希望别因为各种原因爆炸。 中午下午借着刷初赛题的名义摆烂&#xff0c;半道题都没写。 CSP2023RP 初赛 DAY -1 看我发现了什么。…

SpringBoot 集成 SpringSecurity 从入门到深入理解

完整的目录 介绍 SpringSecurity简述 SpringSecuritySpringSecurity 的主要功能说明 项目源码入门案例项目工程路径第一步&#xff1a;加载依赖第二步&#xff1a;创建核心的配置类第三步&#xff1a;增加controller第三步&#xff1a;启动程序小结界面跳转说明密码生成说明 重…