代码随想录算法训练营第四十三天【动态规划part05】 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

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

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

等于把石头尽量分成重量相同的两堆

动规五部曲

  1. 确定dp数组及其下标含义:容量为j的背包,最多能装下的最大重量为dp[j]
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
  3. dp数组的初始化:重量不会是负数,全部初始化为0即可
  4. 确定遍历顺序:先物品,再背包,且遍历背包要倒序
  5. 举例推导dp数组:以[2,4,1,1]为例,如图。最后相撞后的结果为sum-2*dp[target]

代码:

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

494. 目标和

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

等于求有多少种不同的组合方式,能组合成和为left的子集(装满这个背包有几种方法)

动规五部曲

  1. dp数组及其下标含义:填满j(包括j)这么大容积的包,有dp[j]种方法
  2. 确定递推公式:dp[j] += dp[j - nums[i]],举例说明如下,凑整dp[5]的方法就是把所有的dp[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的背包
  3. 初始化:dp[0] = 1,dp[0]是递推结果的起源
  4. 遍历顺序:先物品,再背包,背包要倒序
  5. 举例推导dp数组:nums: [1, 1, 1, 1, 1],target = 3,此时bagSize = 4,如图

代码:

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for (int i : nums) sum += i;// 两种特殊情况if (abs(target) > sum) return 0;if ((target + sum) % 2 == 1) return 0;int bagSize = (target + sum) / 2;// 填满j(包括j)这么大容积的包,有dp[j]种方法vector<int> dp(bagSize+1, 0);// 初始化dp[0] = 1;for (int i = 0; i < nums.size(); i++){for (int j = bagSize; j >= nums[i]; j--){dp[j] += dp[j-nums[i]];}}return dp[bagSize];}
};

474.一和零

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

动规五部曲

  1. 确定dp数组及其下标含义:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]
  2. 递推公式:dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1,则 dp[i][j] = dp[i - zeroNum][j - oneNum] + 1,注意和dp[i][j]本身比较,取较大的值;字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i]),即01背包问题,不过重量有两个维度
  3. 初始化:物品价值不会为负数,因此全部初始化为0
  4. 遍历顺序:先物品,后背包,背包倒序;注意物品是strs里的字符串,背包是题目中的m和n
  5. 举例推导:以 ["10","0001","111001","1","0"],m = 3,n = 3为例,如图

代码:

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 one = 0, zero = 0;for (char c : str){if (c == '0') zero ++;else one++;}// 遍历背包(倒序遍历)for (int i = m; i >= zero; i--){for (int j = n; j >= one; j--){dp[i][j] = max(dp[i][j], dp[i-zero][j-one] + 1);}}}return dp[m][n];}
};

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

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

相关文章

kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info

1、node节点执行 kubeadm join 192.168.10.16:6443 --token hak4zi.hrib9uv4p62t1uok --discovery-token-ca-cert-hash sha256:4337638eef783ee6a66045ad699722079e071c2dfbaa21e37d3174f04d58ea97 --v2 报错 [discovery] Failed to request cluster-info, will try again: G…

数据结构与算法编程题8

试编写算法将带头结点的单链表就地逆置&#xff0c;所谓“就地”是指空间复杂度为 O(1)。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; //结点保存的数据struct LNode…

技术分享| anyRTC之RTN网络

RTN(Real-time Network)中文名&#xff1a;实时音视频传输网络。 RTN是最近几年由各大RTC的云厂商提出的一个全新架构的音视频实时传输网络概念。类似于直播的CDN网络&#xff0c;RTN是对音视频的实时性又强烈要求的场景而设计的&#xff0c;原理上全球端到端的时延通过RTN网络…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中&#xff0c;暴露在外网的接口&#xff0c;为了访问的安全&#xff0c;都是需要在http请求中传入登录时颁发的token。这时候&#xff0c;我们需要有专门用来做校验token并解析用户信息的服务。如下图所示&#xff0c;http请求先经过api网关&#xff0c;网…

云原生正在重塑软件的整个生命周期(内附资料)

随着企业数字化转型进程的发展&#xff0c;企业面临着新旧商业形态的剧变&#xff0c;颠覆和重构时刻都在发生。 企业需要更加快速地感知用户侧的需求变化并做出调整&#xff0c;才有可能在竞争中持续积累优势。业务的个性化、敏捷化、智能化需求日益突显&#xff0c;数字化应…

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题 文章目录 【Python】Vscode解决Python中制表符和空格混用导致的缩进问题1. 问题来源2. 解决Reference 1. 问题来源 在python中使用缩进来进行代码块的分区&#xff0c;通常来说python的一个缩进包含4个空格&#…

[Linux] shell条件语句和if语句

一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式&#xff1a;test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…

UE4基础篇十五:AI行为树

一、学习完教程后需要掌握知识点 1.1、基础概念: 1.1 行为树:控制并显示AI的决策制定过程 1.2 黑板:可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的逻辑 1.3 环境查询: 获取地图环境中的信息进行一个筛选,查找到所需要的的…

ZLMediaKit安装配置和推拉流

一、ZLMediaKit 库简介 ZLMediaKit 是一个基于 C11 的高性能运营级流媒体服务框架 官方写的项目特点&#xff1a; 基于 C11 开发&#xff0c;避免使用裸指针&#xff0c;代码稳定可靠&#xff0c;性能优越。 支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP…

法大大携手广西数通科技,助推金融行业数字化变革

自2017年《关于积极推进供应链创新与应用的指导意见》首次对供应链创新发展作出重要部署以来&#xff0c;我国供应链金融业务实现了有效创新发展。数据显示&#xff0c;2022年&#xff0c;我国供应链金融数字化规模达到11万亿元&#xff0c;数字化渗透率约为30%&#xff0c;相比…

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现1.手动复现2.自动化复现3.python源代码 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任…

看图说话:对脏读、不可重复度、幻读进行总结

1、脏读 「事务B」将 id 为 1 的用户 name 修改为“小卡”&#xff0c;事务未提交。「事务A」查询 id 为 1 的用户数据&#xff0c;此时 name 已为“小卡”。 2、不可重复度 「事务A」第一次读取 id 为 1 的用户&#xff0c;name 是 “卡卡”。「事务B」将 id 为 1 的用户 nam…