力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

news2024/12/23 14:12:02

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

文章目录

      • 力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)
      • 关于0 1 背包问题的总结
          • 01背包遍历顺序:
          • 完全背包遍历顺序:
      • 一、343. 整数拆分
      • 二、96. 不同的二叉搜索树
      • 三、416. 分割等和子集
      • 四、1049. 最后一块石头的重量 II
      • 五、494. 目标和

关于0 1 背包问题的总结

背包问题:一维数组,dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i])。

01背包遍历顺序:

先物品后背包,物品正序,背包逆序。

如若背包正序则会出现同一个物品重复放入,如物品1重量为1,背包空间为1时放入了,背包空间为2时又放入了。
如果先背包后物品,为了避免重复放入背包依然是逆序,背包容量固定时,每种背包容量只能放入一个物品,即为最大的物品,小的物品都放不进来或者被覆盖了。

求组合数排列数:dp[j] += dp[j - nums[i]]

完全背包遍历顺序:

物品背包没有先后顺序,物品背包都是正序。因为同一个物品不限量可以放入多次,在背包采用正序中。

完全背包求组合数,物品在外,背包在内。求排列数,背包在外,物品在内。

一、343. 整数拆分

题目链接:https://leetcode.cn/problems/integer-break/description/
思路:整数拆分是把整数拆分成k个数使其乘积最大,最低是拆分成两个数,根据题目要求的目标定义dp[i]表示i被拆分后相乘的最大值,对于任意一个数来说,最低是拆分成两个数,然后就是两个数以上,我们要求的就是这些情况中的最大值,显然发现是有状态转移的关系的,如dp[i],如果拆分成两个数,那就是(i-j)* j,如果拆分成两个数以上就是dp[i-j] * j,每一个数都要遍历这些情况,故 dp[i] = Math.max(Math.max(dp[i-j] * j, (i-j)*j), dp[i]);

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n+1];
        dp[2] = 1;
        for(int i = 3; i <= n; i++) {
            for(int j = 1; j <= i/2; j++) {
                dp[i] = Math.max(Math.max(dp[i-j] * j, (i-j)*j), dp[i]);
            } 
        } 
        return dp[n];
    }
}

二、96. 不同的二叉搜索树

题目链接:https://leetcode.cn/problems/unique-binary-search-trees/
思路:做动态规划的题目主要是找出重叠子问题,推导出状态转移方程,定义dp[i]表示i个节点的二叉搜索树有多少种结构类型,dp[3]也就是有3个节点我们可以看出,1为根节点有两种,2为根节点有1种,3为根节点有2种,但1为根节点时,右子树有两个节点,这2个节点的种类数量其实是和dp[2]是一样的,由此我们是可以看出关系来的,有N个节点的二叉搜索树的类型数量就等于1-N每一个数字作为根节点时种类数量的累加,这里正好有重叠子问题。故递推公式为dp[i] += dp[j-1] * dp[i-j];
以dp[3]推导举例:
1为根节点,dp[0]*dp[2]。
2为根节点,dp[1]*dp[1]。
3为根节点,dp[2]*dp[0]。这里是有复用关系的。
在这里插入图片描述

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                dp[i] += dp[j-1] * dp[i-j];
            }
        }
        return dp[n];
    }
}

三、416. 分割等和子集

题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/description/
思路:0 1背包问题,划分等和子集,如果和为偶数就可以划分,奇数就不能划分。偶数可以划分,就等于用数组里的数把总和的一半给填满,那么就可以划分等和子集,从而转化为0 1 背包问题。
0 1 背包特点,物品在外,背包在内,背包逆序。内外关系为的是防止,大物品放入后,小物品无法再放入。背包逆序为的是防止物品重复放入。

class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        if(sum % 2 == 1) return false;
        sum /= 2;
        int[] dp = new int[sum+1];
        for(int i = 0; i < nums.length; i++) {
            for(int j = sum; j >= nums[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
            }
        }
        return dp[sum] == sum;
    }
}

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

题目链接:https://leetcode.cn/problems/last-stone-weight-ii/description/
思路:求最后一块是否的重量,就是两两抵消,求最后剩余的无法抵消的数,转换思路想一想其实就是尽量把石头分成两堆大小接近的堆,然后比较最小差值,所以题目就转变成了0 1背包问题,总数和的一半作为背包,求的结果后,乘2与总数相减即得最后一块是否的重量。

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum = 0, total = 0;
        for(int i = 0; i < stones.length; i++) {
            total += stones[i];
        }

        sum = total / 2;
        int[] dp = new int[sum+1];
        for(int i = 0; i < stones.length; i++) {
            for(int j = sum; j >= stones[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
            }
        }
        return total - dp[sum] * 2;
    }
}

五、494. 目标和

题目链接:https://leetcode.cn/problems/target-sum/description/
思路:0 1 背包求组合数,想办法转化为背包,得到背包空间,因为分为正数和负数,a + b = sum; a - b = target。
a = (sum+target) / 2;
由此可以得到正数背包,从而转变从背包求组合数,定义dp[j]表示,背包空间为j时的物品组合数,那么自然,递推公式为dp[j] += dp[j - nums[i]]; 所以需要初始化为1.

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        if(sum < Math.abs(target) || (sum + target) % 2 == 1) return 0;
        int left = Math.abs((sum + target) / 2);
        int[] dp = new int[left+1];
        dp[0] = 1;
        for(int i = 0; i < nums.length; i++) {
            for(int j = left; j >= nums[i]; j--) {
                dp[j] += dp[j - nums[i]];
            }
        }
        return dp[left];
    }
}

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

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

相关文章

探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析

mfc100u.dll丢失是一个比较常见的情况&#xff0c;由于你电脑的各种操作&#xff0c;是有可能引起dll文件的缺失的&#xff0c;而mfc100u.dll就是其中的一个重要的dll文件&#xff0c;它的确实严重的话是会导致程序打不开&#xff0c;系统错误的。今天我们就来给大家科普一下mf…

明天报名!!济宁教师招聘报名照片及常见问题

明天报名!!济宁教师招聘报名照片及常见问题 山东济宁教师招聘1000多人 报名时间: 2024年4月25日9:00-4月28日16:00 缴费时间: 2024年4月25日11:00-4月30日16:00 打印准考证:2024年5月23日9:00-5月26日9:30 初审时间: 2024年4月25日11:00-4月29日16:00 查询时间: 2024年4月…

c++初阶——类和对象(中)

大家好&#xff0c;我是小锋&#xff0c;我们今天继续来学习类和对象。 类的6个默认成员函数 我们想一想如果一个类什么都没有那它就是一个空类&#xff0c;但是空类真的什么都没有吗&#xff1f; 其实并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以…

JCE cannot authenticate the provider BC

前言&#xff1a; 公司项目有用AES加密的&#xff0c;报错原因是BC&#xff08;Bouncy Castle&#xff09;提供的加密服务时&#xff0c;JCE&#xff08;Java Cryptography Extension&#xff09;无法进行验证。这通常是由于 JCE 的默认策略文件不支持所需的加密算法&#xff…

北京车展“第一枪”:长安汽车发布全球首款量产可变新汽车

4月25日&#xff0c;万众瞩目的2024北京国际汽车展览会在中国国际展览中心如期而至。作为中国乃至全球汽车行业的盛宴&#xff0c;本次车展也吸引了无数业内人士的高度关注。 此次北京车展以“新时代 新汽车”为主题&#xff0c;汇聚了1500余家主流车企及零部件制造商&#xff…

最优化理论探析:函数优化与组合优化,约束优化与无约束优化的交织与应用

最优化理论作为运筹学、数学规划和工程科学中的核心研究领域&#xff0c;涵盖了函数优化、组合优化、约束优化和无约束优化等多个分支。这些理论在解决实际问题中发挥着重要作用&#xff0c;从资源分配、生产调度到网络路由、物流优化&#xff0c;再到机器学习、人工智能等领域…

DevOps(十四)怎么实现Gitlab更新后Jenkins自动发布

目录 1、在 Jenkins 中安装 GitLab 插件 2、在 GitLab 中创建一个访问令牌(Access Token) 3、在 Jenkins 中配置 GitLab 连接 4、在 Jenkins 中创建一个新的任务(Job) 5、在 GitLab 中配置 Webhook 6、以下是一些补充说明和建议 持续集成的一个特点就是开发可以随时提交&…

SRE运维和DevOps之间是什么关系?

一、SRE运维和DevOps之间是什么关系&#xff1f; SRE运维和DevOps之间存在紧密的联系和相互依赖。 首先&#xff0c;两者都是开发运维一体化时代的产物&#xff0c;旨在通过协同工作来构建高效可靠的软件运维团队。SRE&#xff08;Site Reliability Engineering&#x…

【UE5.1 C++】提升编译速度

步骤 1. 在“C:\Users\用户\AppData\Roaming\Unreal Engine\UnrealBuildTool”目录下找到“BuildConfiguration.xml”文件 打开“BuildConfiguration.xml”&#xff0c;添加如下部分内容 <?xml version"1.0" encoding"utf-8" ?> <Configuratio…

FastGPT编译前端界面,并将前端界面映射到Docker容器中

建议在linux系统下编译 1、克隆代码 git clone https://github.com/labring/FastGPT 2、进入FastGPT目录&#xff0c;执行 npm install 3、进入projects/app目录&#xff0c;执行 npm run dev 此时会自动下载依赖包&#xff0c;这里如果执行npm install的话&#xff0c;…

OS复习笔记ch4

引言 上一章&#xff0c;我们学习了进程的相关概念和知识&#xff0c;不知道小伙伴们的学习进度如何&#xff0c;没看的小伙伴记得去专栏看完哦。 线程从何而来 我们之前说过&#xff0c;进程是对程序运行过程的抽象&#xff0c;它的抽象程度是比较高的。 一个进程往往对应一…

LabVIEW专栏九、类的应用

一、类的应用 接上一章"类" 类在项目中&#xff0c;一般会在类的私有成员簇内&#xff0c;包含一个数据类型为参数类的队列。 例如网口类&#xff0c;里面实际会包含很多信息&#xff0c;有IP地址和端口等等参数。这些参数如果不放在队列引用中缓存下来&#xff0c;…

【热门前端【vue框架】】——vue框架和node.js的下载和安装保姆式教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;程序员-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

FPM 快速报表开发

背景&#xff1a; 使用FPM开发报表时&#xff0c;如果报表字段过多&#xff0c;页面拖拽等操作不方便 报表数量过多时&#xff0c;新建应用操作步骤较为繁琐 更习惯通过少量代码而非页面操作去实现功能 处理&#xff1a; 将FPM报表开发简化为类似GUI端ALV的开发过程:&#xff…

大模型微调之 使用 LLaMA-Factory 微调 Llama3

大模型微调之 使用 LLaMA-Factory 微调 Llama3 使用 LLaMA Factory 微调 Llama-3 中文对话模型 安装 LLaMA Factory 依赖 %cd /content/ %rm -rf LLaMA-Factory !git clone https://github.com/hiyouga/LLaMA-Factory.git %cd LLaMA-Factory %ls !pip install "unsloth…

力扣数据库题库学习(4.25日)

1484. 按日期分组销售产品 问题链接 思路与分析 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。我来分析一下&#xff0c;这里的题目要求其实就是统计不同日期下的销售产品数&#xf…

excel文件导入dbeaver中文乱码

1.将excel文件进行另存为&#xff0c;保存类型选择【CSV】 2.选择【工具】–>【web选项】–> 【编码】–> 【简体中文&#xff08;GB18030&#xff09;】 3.在DBeaver进行数据导入 直接导入应该就可以&#xff0c;如果不行的话按下面处理。 选择【导入数据——选择cs…

【3GPP】【核心网】【4G】LTE中S1-MME流程字段分析(二)

1. 欢迎大家订阅和关注&#xff0c;精讲3GPP通信协议&#xff08;2G/3G/4G/5G/IMS&#xff09;知识点&#xff0c;专栏会持续更新中.....敬请期待&#xff01; 承接上文 目录 6. PDN Connectivity 7. PDN Disconnection 8. EPS Bearer resource allocation 9. EPS Bearer r…

Gin+WebSocket实战——在线聊天室WebSocketDemo详细使用教程

文章目录 仓库地址项目简介如何使用 仓库地址 Github&#xff1a;https://github.com/palp1tate/WebsocketDemo 欢迎star&#xff01;&#x1f60e; 项目简介 利用 GinWebSocket 实现的在线聊天室Demo项目&#xff0c;支持加入/离开聊天室广播、给其他用户发送消息等。 如何…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…