【动态规划part05】| 1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零

news2024/11/26 0:27:15

目录

🎈LeetCode 1049.最后一块石头的重量||

🎈 LeetCode494. 目标和

🎈LeetCode 474.一和零


🎈LeetCode 1049.最后一块石头的重量||

链接:1049.最后一块石头的重量

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

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

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

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

 

 

一维dp数组: 

ublic int lastStoneWeightII(int[] stones) {
        // 让石头分成质量尽可能相等的两堆
        int sum=0;
        for(int i=0;i<stones.length;i++){
            sum+=stones[i];
        }
        int target=sum/2;
        // dp[j]表示容量为j的背包,最大可背的重量
        int[] dp=new int[target+1];
        // dp[j]=Math.max(dp[j],dp[j-stons[i]]+stons[i]);
        dp[0]=0;
        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];
    }

 二维dp数组:

public int lastStoneWeightII(int[] stones) {
        // 让石头分成质量尽可能相等的两堆
        int sum=0;
        for(int i=0;i<stones.length;i++){
            sum+=stones[i];
        }
        int target=sum/2;
        // dp[i][j]表示从下标为[0~i]选几块石头装在容量为j的背包,最大可背的重量
        int[][] dp=new int[stones.length][target+1];
        // dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-stons[i]]+stons[i]);
        // 初始化
        for(int i=0;i<=target;i++){
            if(stones[0]<=i){
                dp[0][i]=stones[0];
            }    
        }
        for(int i=1;i<stones.length;i++){
            for(int j=0;j<=target;j++){
                if(stones[i]<=j){
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-stones[i]]+stones[i]);
                }else{
                    dp[i][j]=dp[i-1][j];
                }
                
            }
        }
        return sum-dp[stones.length-1][target]*2;
    }

🎈 LeetCode494. 目标和

链接:494.目标和

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

 

 

public int findTargetSumWays(int[] nums, int target) {
        // dp[j]表示容量为j的背包有dp[j]种方法
        // right-left=target;
        // left=sum-right;
        // right=(target+sum)/2  右边为定值,背包大小为right
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        if ( target < 0 && sum < -target) {
            return 0;
        }
        if((sum+target)%2==1){
            return 0;
        }
        int bagSize=(sum+target)/2;
        if(bagSize<0){
            bagSize=-bagSize;
        }
        int[] dp=new int[bagSize+1];
        // dp[j]=dp[j]+dp[j-nums[i]]
        dp[0]=1;
        for(int i=0;i<nums.length;i++){
            for(int j=bagSize;j>=nums[i];j--){
                dp[j]=dp[j]+dp[j-nums[i]];
            }
        }
        return dp[bagSize];


    }

🎈LeetCode 474.一和零

链接:474.一和零

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

 

 

public int findMaxForm(String[] strs, int m, int n) {
        // dp[i][j]表示i个0,j个1的最大子集长度为dp[i][j]
        int[][] dp=new int[m+1][n+1];
        // dp[i][j]=Math.max(dp[i-zero][j-one]+1,dp[i][j]);
        dp[0][0]=0;
        for (String str : strs) {   //遍历物品
            int oneNum = 0;
            int zeroNum = 0;
            for (char ch : str.toCharArray()) {
                if (ch == '0') {
                    zeroNum++;
                } else {
                    oneNum++;
                }
            }
            //倒序遍历
            for (int i = m; i >= zeroNum; i--) {
                for (int j = n; j >= oneNum; j--) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                }
            }
        }
        return dp[m][n];
    }

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

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

相关文章

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…

西门子plc的通信联网不同网段通讯

你是否曾经遇到过需要将不同品牌的PLC数据进行交换的情况&#xff1f;今天我们要介绍的就是远创智控YC8000-PN的ModbusTCP客户机功能&#xff0c;它可以帮助你实现这一需求。 1, 远创智控YC8000-PN的lan1口连接西门子S7-1200的网口&#xff0c;FX5U自带以太网口与远创智控YC8…

JVM-Java虚拟机

JVM——Java虚拟机&#xff0c;是Java实现平台无关性的基石。 基本概念&#xff1a;JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与…

linux中cgroup的简单使用

文章目录 1 简介1.1 主要功能1.2 cgroups子系统 2 绑定进程到指定cpu核数3 限制进程cpu使用率3.1 示例13.2 示例2 4 限制内存使用量5 限制磁盘读取速度 1 简介 Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个功能&#xff0c;用来限制&#xff0c;控制与…

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意&#xff1a;如果是直接把远程代码同步到本地&#xff0c;默认是你在 .gitignore中设置是无效的&#xff0c;代码一样会提交&#xff0c;需要先使用上面的截图去掉缓存&…

进程控制学习笔记

文章目录 进程退出孤儿进程僵尸进程进程回收waitpid()函数 进程退出 子进程的退出需要父进程对其资源的释放&#xff0c;子进程只能对用户区的数据进行释放&#xff0c;无法完成对内核区的释放。 可以获取到。 两个退出的区别&#xff1a; 系统调用不会刷新缓冲区&#xff…

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…

html input 展示隐藏的密码

<!DOCTYPE html> <html> <meta http-equiv"Content-Type" content"text/html;charsetutf-8"/> <body><h2>登录表格</h2><form action"/action_page.php"><div class"container"><…

vue3-element-plus,控制表格多选的数量

1. 需求描述 控制表格的多选&#xff0c;最多只能选择5条数据&#xff0c;并且其他项禁用 2. 需求描述 <!-- selection-change 当选择项发生变化时会触发该事件--><template><el-tableref"multipleTableRef"v-loading"loading":data"…

微服务基础理论

微服务简介 微服务Microservices之父&#xff0c;马丁.福勒&#xff0c;对微服务大概的概述如下&#xff1a; 就目前而言&#xff0c;对于微服务业界并没有一个统一的、标准的定义&#xff08;While there is no precise definition of this architectural style ) 。但通在其…

flutter开发实战-build编译macos环境可安装dmg

flutter开发实战-build编译macos环境可安装dmg 之前开发中需要变异Macos成dmg的需求&#xff0c;这里记录一下build编译macos环境可安装dmg的过程。 一、工程目录 目录如下 如果工程没有macos&#xff0c;需要增加macos支持的平台。命令 flutter create --platformswindo…

Python爬虫+数据可视化:分析唯品会商品数据

目录 前言数据来源分析1. 明确需求2. 抓包分析&#xff1a;通过浏览器自带工具: 开发者工具 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据发送请求解析数据保存数据 数据可视化先读取数据泳衣商品性别占比商品品牌分布占比各大品牌商品售价平均价格各…

华为数通HCIP-ISIS基础

IS-IS的基本概念 isis&#xff08;中间系统到中间路由协议&#xff09; 链路状态路由协议、IGP、无类路由协议&#xff1b; IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建…

每日一道面试题之HashSet的实现原理~

HashSet是Java中的一个集合类&#xff0c;它实现了Set接口(如下所示为源码)&#xff0c;它用于存储不重复的元素。HashSet的实现原理主要基于哈希表&#xff08;Hash Table&#xff09;&#xff0c;其内部使用了一个HashMap来存储元素&#xff0c;其数据存储结构是数组链表。在…

数学建模学习(1):Matlab函数

逻辑基础 1.逻辑变量 Logical类型: true(真值); false(假值) atrue bfalse 2.逻辑判定 数字逻辑&#xff1a; 常用的特殊逻辑&#xff1a; 3.逻辑运算 交叉知识-扩充优先级 优先级 符号 1&#xff08;最高&#xff09; 括号( ) 2 转置 ’ &#xff1b;次幂 ^ 3 一元…

svo1论文

SVO: Fast Semi-Direct Monocular Visual Odometry 摘要 我们提出了一种半直接单目视觉测距算法&#xff0c;该算法精确、鲁棒且比当前算法更快最先进的方法。半直接方法为运动估计技术消除了需要高成本的特征提取和鲁棒匹配。我们的算法可直接在像素强度上处理&#xff0c;以…

【C++初阶】---C++入门篇

文章目录 前言&#x1f31f;一、C历史介绍&#x1f31f;二、命名空间&#x1f30f;2.1.C与C对比&#x1f30f;2.2.命名空间的引入&#x1f30f;2.3.命名空间定义&#x1f30f;2.4.命名空间的使用&#x1f30f;2.5.对上述C与C对比中的第二个不同点的解释&#xff1a; &#x1f3…

基于有序模式的度量对多变量时间序列进行非线性分析研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 基于有序模式的度量&#xff08;Ordinal Pattern-based Measures&#xff09;是一种用于多变量时间序列非线性分析的方法。它可以通过分析时间…

【C++】医学影像PACS管理系统源码支持三维图像后处理和重建

前言&#xff1a;随着计算机科学与医疗设备的迅猛发展&#xff0c;数字化图像技术与现代通讯及计算机技术相结合&#xff0c;形成了PACS (picture archiving and communication system影像储存与传输系统)。它将医学图像资料转化为数字信息通过高速计算机设备及通讯网络&#x…