LeetCode 1049. 最后一块石头的重量 II(DP)

1. 题目

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。
假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。

最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。

示例:
输入:[2,7,4,1,8,1]
输出:1
解释:
组合 24,得到 2,所以数组转化为 [2,7,1,8,1],
组合 78,得到 1,所以数组转化为 [2,1,1,1],
组合 21,得到 1,所以数组转化为 [1,1,1],
组合 11,得到 0,所以数组转化为 [1],这就是最优值。提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-stone-weight-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 1046. 最后一块石头的重量(priority_queue 堆)

  • 题目说任意两块石头可以相撞,转化为把n个石头分为2堆,任意一堆越接近总重s的一半
  • 这两堆做差肯定就是最小的
  • 那么就变成 0-1 背包,每个石头取或不取,求不超过s/2 的最大的重量
class Solution {	//C++
public:int lastStoneWeightII(vector<int>& stones) {int i, j, n = stones.size(), sum = accumulate(stones.begin(),stones.end(), 0);vector<vector<bool>> dp(n+1,vector<bool>(sum/2+1, false));dp[0][0] = true;//dp[i][w], 遍历完第i个石头,可以得到重量为w吗?for(i = 1; i <= n; i++)//样本维度{for(j = 0; j <= sum/2; ++j)//重量维度{if(dp[i-1][j]){dp[i][j] = dp[i-1][j];//不取if(j+stones[i-1] <= sum/2)//不超,取dp[i][j+stones[i-1]] = true;}}}j = sum/2;while(dp[n][j] != true)//最接近一半的重量是 j j--;return sum-2*j;//一半是sum-j,一半是 j,做差}
};
  • 状态只跟上一行有关,再用逆序滚动数组,节省存储空间
class Solution {	//C++
public:int lastStoneWeightII(vector<int>& stones) {int i, j, n = stones.size(), sum = accumulate(stones.begin(),stones.end(), 0);vector<bool> dp(sum/2+1, false);dp[0] = true;//dp[w], 遍历完第i个石头,可以得到的重量为w吗?for(i = 1; i <= n; i++)//样本维度{for(j = sum/2; j >= 0; --j)//重量维度{if(dp[j] && j+stones[i-1] <= sum/2)dp[j+stones[i-1]] = true;}}j = sum/2;while(dp[j] != true)j--;return sum-2*j;}
};

8 ms 8.2 MB

python3 解答

class Solution:# py3def lastStoneWeightII(self, stones: List[int]) -> int:n = len(stones)s = sum(stones)dp = [False]*(s//2+1)dp[0] = Truefor i in range(1,n+1):for j in range(s//2,-1,-1):if dp[j] and j+stones[i-1] <= s//2:dp[j+stones[i-1]] = Truej = s//2while not dp[j]:j -= 1return s-2*j

52 ms 13.6 MB

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

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

相关文章

特征计算 - Jaccard 相似系数与 Python 代码实现

Jaccard 相似系数又称为Jaccard相似性度量&#xff08;Jaccard系数&#xff0c;Jaccard 指数&#xff0c;Jaccard index&#xff09;。用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大&#xff0c;样本相似度越高。定义为相交的大小除以样本集合的大小&#xff1a;…

LeetCode 1293. 网格中的最短路径(DP/BFS)

1. 题目 给你一个 m * n 的网格&#xff0c;其中每个单元格不是 0&#xff08;空&#xff09;就是 1&#xff08;障碍物&#xff09;。 每一步&#xff0c;您都可以在空白单元格中上、下、左、右移动。 如果您 最多 可以消除 k 个障碍物&#xff0c;请找出从左上角 (0, 0) 到…

员工奖金需要交税吗_企业为员工发福利 奖品奖金也需要缴税

原标题&#xff1a;企业为员工发福利 奖品奖金也需要缴税企业的福利待遇经常成为员工炫耀的资本&#xff0c;过生日企业准备了小礼品&#xff0c;各种节日为员工准备的物品&#xff0c;举办不容形式的年会的时候对先进工作者发放奖金、奖品及举行抽奖活动。那么&#xff0c;发放…

天气预报Dom解析(转)

view plain<span style"font-family:Arial, Verdana, sans-serif;color:#000000;"><span style"white-space: normal;"><span style"color:#000099;"> </span></span></span> DOM是用与平台无关和语言无关…

用户行为分析模型-(行为事件分析、用户留存分析、漏斗分析、行为路径分析、用户分群、点击分析)

最近有些忙&#xff0c;但是看到了很好的分析模型也要跟大家分享的&#xff0c;这篇博客有些粗糙&#xff0c;主要是po上一些链接供大家学习&#xff0c;有时间的话&#xff0c;我也会写出自己关于用户行为分析的理解的。 下面是关于用户行为分析常见的分析维度&#xff0c;有…

[scikit-learn 机器学习] 4. 特征提取

文章目录1. 从类别变量中提取特征2. 特征标准化3. 从文本中提取特征3.1 词袋模型3.2 停用词过滤3.3 词干提取和词形还原3.4 TF-IDF 权重扩展词包3.5 空间有效特征向量化与哈希技巧3.6 词向量4. 从图像中提取特征4.1 从像素强度中提取特征4.2 使用卷积神经网络激活项作为特征本文…

webgis 行政图报错_WebGIS 地图 示例源码下载

【实例简介】【实例截图】【核心代码】esri Deomhtml, body, #map {height: 100%;width: 100%;}body {background-color: #fff;overflow: hidden;}#BasemapToggle {position: absolute;right: 20px;top: 20px;z-index: 50;}#HomeButton {left: 25px;position: absolute;top: 93…

正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码

目录 1.乱码符号种类较少&#xff0c;用replace() 2.乱码字符种类较多&#xff0c;用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中总有各种乱码字符&#xff0c;比如&#xff01;#&#xffe5;%……&a…

《JavaScript高级程序设计》阅读笔记(一):ECMAScript基础

2.1 语法 区分大小写、变量弱类型、行尾分号可有可无、注释为双斜线、括号表明代码块 2.2 变量 变量用var声明&#xff0c;变量的命名规则&#xff1a;第一个字符必须是字母、下划线或美元符号&#xff1b;余下的字符可以是下划线、美元符号或任何字母或数字字符。 变量命名规范…

v8引擎和v12引擎_为什么V8和V12发动机至今还存在,而V10发动机却早早被淘汰了?...

为什么V8和V12发动机至今还存在&#xff0c;而V10发动机却早早被淘汰了&#xff1f;估计你看到标题的时候心中已经有了相关的答案&#xff0c;但是如果我说你所想的和真实的原因并不一样呢&#xff01;随着国家对环保越来越重视&#xff0c;大排量发动机逐渐也成为了汽车工业中…

LeetCode 第 29 场双周赛(890/2259,前39.4%)

文章目录1. 比赛结果2. 题目1. LeetCode 5432. 去掉最低工资和最高工资后的工资平均值 easy2. LeetCode 5433. n 的第 k 个因子 medium3. LeetCode 5434. 删掉一个元素以后全为 1 的最长子数组 medium4. LeetCode 5435. 并行课程 II hard1. 比赛结果 做出来了3道题。第三题卡了…

Hive关于数据库的增删改查

创建库 if not exists&#xff1a;防止db_hive已经存在 CREATE DATABASE if not exists db_hive;CREATE DATABASE if not exists db_hive COMMENT create my database named db_hive;#带注释CREATE DATABASE if not exists db_hive WITH dbproperties(aaaa,bbbb);#带属性 使…

【dll 返回字符串 】2

【vc <--> vc】返回void* 类型void* __stdcall torrent_hash( const char *TorrentFilePath){char szText[41]{0};if(strcmp(TorrentFilePath,"") 0 || TorrentFilePath NULL)return NULL;string strHashString "abcdefg"; sprintf(szText,&qu…

Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)

建表 基本语句格式 CREATE [external] TABLE if not exists student #默认建立内部表&#xff0c;加上external则是建立外部表(id int COMMENT学号,sname string COMMENT用户名,age int COMMENT年龄)#字段名称&#xff0c;字段类型&#xff0c;字段描述信息 COMMENT 记录学生…

LeetCode 1496. 判断路径是否相交(set)

1. 题目 给你一个字符串 path&#xff0c;其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’&#xff0c;分别表示向北、向南、向东、向西移动一个单位。 机器人从二维平面上的原点 (0, 0) 处开始出发&#xff0c;按 path 所指示的路径行走。 如果路径在任何位置上出…

python数据框循环生成_python - 如何在 Pandas 的for循环迭代中创建多个数据框?

我需要在熊猫中创建一个函数&#xff0c;该函数将单个数据框作为输入&#xff0c;并根据特定条件返回多个数据框作为输出。 (请检查下面的示例以了解情况)。我很难弄清楚如何做。我需要一些专家的编码建议。范例1&#xff1a;输入 100列的数据框输出数据帧1的前10&#xff05;列…

除去数组中的空字符元素array_filter()

除去数组中的空字符元素 <?php$str1_arrayarray(电影618,,http://www.movie618.com,,1654,);$str1_arrayarray_filter($str1_array);print_r($str1_array); ?> 显示结果&#xff1a; Array( [0] > 电影618 [2] > http://www.movie618.com [4] > …

Hive的数据加载与导出

普通表的加载 1.load方式 load data [local] inpath [源文件路径] into table 目标表名; 从HDFS上加载数据&#xff0c;本质上是移动文件所在的路径 load data inpath /user/student.txt into table student; 从本地加载数据&#xff0c;本质上是复制本地的文件到HDFS上 lo…

电压压力蕊片_一文让你知道什么是压力变送器

一般来说&#xff0c;压力变送器主要由测压元件传感器(也称作压力传感器)、测量电路和过程连接件三部分组成。它能将测压元件传感器感受到的气体、液体等物理压力参数转变成标准的电信号(如4~20mADC等)&#xff0c;以供给指示报警仪、记录仪、调节器等二次仪表进行测量、指示和…

LeetCode 1497. 检查数组对是否可以被 k 整除(余数配对)

1. 题目 给你一个整数数组 arr 和一个整数 k &#xff0c;其中数组长度是偶数&#xff0c;值为 n 。 现在需要把数组恰好分成 n / 2 对&#xff0c;以使每对数字的和都能够被 k 整除。 如果存在这样的分法&#xff0c;请返回 True &#xff1b;否则&#xff0c;返回 False 。…