代码随想录算法训练营第42天(py)| 动态规划 |1049. 最后一块石头的重量 II、494. 目标和、474.一和零

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

力扣链接
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

思路

尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,思路就和416. 分割等和子集差不多。重量为stones[i],物品的价值也为stones[i]。
五部曲:

  1. 确定dp含义
    容量为j的背包,最多能背起的重量为dp[j]
    dp[target] == target 的时候,背包就装满了
  2. 确定递推公式
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])
  1. 初始化
    元素初始化为0,
    因为提示中给出1 <= stones.length <= 30,1 <= stones[i] <= 1000,所以最大重量就是30 * 1000 。
    而我们要求的target其实只是最大重量的一半,所以dp数组开到15000大小就可以了。
  2. 确定遍历方向
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]);}
}
class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:dp = [0] * 15000total_sum = sum(stones)target = total_sum//2for stone in stones: #遍历物品for j in range(target, stone - 1, -1): # 对每块石头,从 target 向下遍历到这块石头的重量#对于每个可能的重量 j,尝试更新dp[j]dp[j] = max(dp[j], dp[j - stone] + stone)return (total_sum - dp[target]) - dp[target]

最后,dp[target] 是我们能得到的接近总重量一半的最大重量
(total_sum - dp[target])是另一堆石头的总重量

494. 目标和

力扣链接
给你一个非负整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

思路

设sum为nums元素总和
+运算符求得的元素和为x,则-运算符求得的元素和为sum - x
就是要 x - (sum - x) = target
即x = (target + sum)/2
问题:装满容量为x的背包有几种方法

  1. 确定dp含义
    dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法。
  2. 确定递推公式
    例如:dp[j],j 为5,
    已经有一个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[j] += dp[j - nums[i]]

组合类问题都可以用类似的递推公式。

  1. 初始化
    初始化 dp[0] 为 1
class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:total_sum = sum(nums)if abs(target)>total_sum: #无论如何都加不到这么大return 0if (target + total_sum)%2 == 1: #x=(target + sum)/2无法取整的情况return 0target_sum = (target + total_sum)//2dp = [0] * (target_sum + 1)dp[0] = 1for num in nums:for j in range(target_sum, num - 1, -1):dp[j] += dp[j-num]return dp[-1]

474.一和零

力扣链接
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

思路

本题中strs 数组里的元素就是物品,而m 和 n相当于是一个两维度的背包。

  1. 确定dp
    dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
  2. 确定递推公式
    前一个strs里的字符串有zeroNum个0,oneNum个1
dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
  1. 初始化
    全初始化为0即可
class Solution:def findMaxForm(self, strs: List[str], m: int, n: int) -> int:dp = [[0]*(n+1) for _ in range(m+1)]for s in strs:zeroNum = s.count('0') # 0的个数oneNum = len(s) - zeroNum # 1的个数for i in range(m, zeroNum - 1, -1):for j in range(n, oneNum - 1, -1):dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1)return dp[-1][-1]

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

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

相关文章

【Linux】—Apache Hive 安装部署

文章目录 前言认识Metadata认识Metastoremetastore三种配置方式 一、安装前准备二、下载hive-3.1.2安装包三、下载完成后&#xff0c;通过xftp6上传到Linux服务器上四、解压Hive安装包五、配置Hive六、内嵌模型安装—Hive元数据配置到Derby七、本地模式安装—Hive元数据配置到M…

高等数学笔记(二):极限

一、数列极限的定义 以下符号表示 “对于任意给定的” 以下符号表示 “存在” 以下符号表示 “如果什么&#xff08;箭头左&#xff09;&#xff0c;则什么&#xff08;箭头右&#xff09;” 二、收敛数列的性质 2.1 唯一性 2.2 有界性 2.3 保号性 2.4 子数列收敛性 三、函数…

文字转语音在线怎么转?总结了三种快速转换

文字转语音在线怎么转&#xff1f;在数字化信息爆炸的时代&#xff0c;文字转语音的操作也越来越多。无论是为了制作视频配音、播客节目&#xff0c;还是为了方便视力障碍者阅读&#xff0c;文字转语音技术都提供了极大的便利。因此&#xff0c;本文将总结三种文字转语音的在线…

2024年【高压电工】模拟考试题及高压电工考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工模拟考试题为正在备考高压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的高压电工考试试题祝您顺利通过高压电工考试。 1、【单选题】下列()安全用具是在电气操作中使用的基本安全用具。…

华为安全Security认证,你了解多少?

华为安全Security 认证包含HCIA-Security, HCIP-Security,HCIE-Security。HCIA-Security 掌握中小型网络信息安全基础知识与相关技术&#xff08;华为防火墙技术、加解密技术、PKI 证书体系等&#xff09;&#xff0c;具备搭建小型企业信息安全网络的能力&#xff0c;实现中小企…

文案提取小帮手如何提取文案或视频转文字呢?

文案提取小帮手通常是指专门用于从视频、音频中提取文本内容的工具。以下是一些常见的方法来提取文案或将视频转换为文字&#xff1a; 方法一&#xff1a;必应搜索引擎 打开必应输入【视频下载plus助手工具】 然后点击进入选择视频转文案按钮使用手机扫码即可体验视频转文字功…

threejs教程:绘制3D地图(广东省区划图)

一、效果展示&#xff1a; 二、开发准备 Three.js中文文档&#xff1a;Three.js中文网 Three.js文本渲染插件&#xff1a;Troika 3D Text - Troika JS 行政区划边界数据查询&#xff08;阿里云数据可视化平台&#xff09;&#xff1a;DataV.GeoAtlas地理小工具系列 1. 在项目…

DDL与DML语句

1、DDL语句 CREATE table user(user_id INT AUTO_INCREMENT PRIMARY KEY,userName VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(255) NOT NULL,email VARCHAR(100) UNIQUE,phone VARCHAR(20) UNIQUE,create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE user_w…

【Ubuntu开发入门之“orangepi H3 linux开发③kernel移植调试“】

Ubuntu开发入门之"orangepi H3 linux开发③kernel移植调试 问题描述解决方法获取源码内核适配和编译制作TF卡分区,以备存放各个分区和文件根文件系统拷贝郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Allwinner H3 O…

Nginx和Tomcat负载均衡、动静分离集群1

一、Nginx负载均衡 1.负载均衡概念 服务端接受来自客户端的请求中&#xff0c;既有动态资源也有动态资源&#xff0c;静态资源由 Nginx 提供服务&#xff0c;动态资源 Nginx 转发至后端

【机器学习300问】123、什么是GRU?GRU网络的基本结构是怎样的?

在之前的文章中&#xff0c;我们谈到了标准RNN所面临的诸多困境&#xff0c;你也可以理解为RNN的缺点。其中最让人苦恼的就是梯度消失问题&#xff0c;正是由于梯度消失问题的存在&#xff0c;导致RNN无法获得上下文的长期依赖信息。那么就没有办法解决了吗&#xff1f;非也&am…

Linux实现: 客户端(cli01)通过TCP(或UDP)连接到聊天服务器(serv)进行聊天?(伪代码版本)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Flutter 小技巧之面试题里有意思的异步问题

很久没更新小技巧系列了&#xff0c;本次简单介绍一下 Flutter 面试里我认为比较有意思的异步基础知识点。 首先我们简单看一段代码&#xff0c;如下代码所示&#xff0c;是一个循环定时器任务&#xff0c;这段代码里&#xff1a; testFunc 循环每 1 秒执行一次 asyncWorkasy…

C++ 60 之 虚析构和纯虚析构

#include <iostream> #include <string> #include <cstring> using namespace std;class Animal13{ public:Animal13(){cout << "Animal的默认构造函数" << endl;}virtual void speak(){cout << "动物叫" << en…

?? 与 || 在 JavaScript 中的微妙差别

起初&#xff0c;你可能会认为你可以随意替换任何你喜欢的人&#xff0c;对吗&#xff1f; 错误。他们并非你所想的那样。 我们必须一劳永逸地学习这个区别&#xff0c;以避免日后出现痛苦的错误。 这个差别是什么&#xff1f; 这是他们对待真值和假值的令人难以置信的对比。这…

C++ 61 之 函数模版

#include <iostream> #include <string> using namespace std;void swapInt(int &a,int &b){int temp a;a b;b temp; }void swapDou(double& a, double& b){double temp a;a b;b temp; }// T代表通用数据类型&#xff0c;紧接着后面的代码&a…

科技前沿:Web3技术驱动下的物联网创新

随着Web3技术的迅猛发展&#xff0c;物联网&#xff08;IoT&#xff09;作为连接和互操作性的关键&#xff0c;正迎来一场前所未有的革命。本文将深入探讨Web3技术如何驱动物联网的创新&#xff0c;以及这种创新如何重新定义我们对智能设备、数据安全和网络架构的理解。 1. Web…

PR软件视频抠图换背景

1 新建项目 2 新建序列 在项目的右下角有个图标&#xff0c;新建 序列 序列是视频的制作尺寸&#xff0c;根据自己的需要选择 3 新建颜色遮罩 在项目的右下角--新建颜色遮罩--选择黑色--确定 4 导入视频 把要导入视频的文件夹打开&#xff0c;把视频拖到 项目 里 把黑色遮罩拖…

56.SAP MII开发的一个系统响应错误 Error code: ICMETIMEOUT

问题 一个SAP MII开发的项目&#xff0c;最近新增了一个功能&#xff0c;查询数据源量比较大&#xff0c;逻辑有点复杂&#xff0c;大约7-8分钟。发布到生产系统后&#xff0c;发生响应错误&#xff0c;返回 Error code: ICMETIMEOUT <!-- Error code: ICMETIMEOUT -->\r…

Camunda 7.x 系列【68】实战篇之我的待办任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 前后端基于若依:https://gitee.com/y_project/RuoYi-Vue 流程设计器基于RuoYi-flowable:https://gi…