算法|Day37 动态规划5

news2024/12/23 10:19:30

LeetCode 1049- 最后一块石头的重量 II

题目链接:力扣

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

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

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

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

解题思路

我们通过算出总重量的一半,然后再看这么大容量的背包能装多少重量石头,再相减即可。

也就是我们装了 target = sum/2,的石头,剩下还有 sum - target的石头。所以最后相撞就剩下

sum - target - target的重量的石头了。

  1. 确定dp数组(dp table)以及下标的含义

dp[i]:表示能够装下的最大重量

  1. 确定递推公式

这题是装石头,有点像昨天的一道题。也就是通过 石头总重量/2,然后看看能装下的最大石头重 量是多少,所以dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);

  1. dp数组如何初始化

全部都初始化为0

  1. 确定遍历顺序

一维数组先遍历物品,再倒序遍历背包

  1. 举例推导dp数组
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        vector<int> dp(15001, 0);
        int sum = 0;
        for (int i = 0; i < stones.size(); i++) sum += stones[i];
        int target = sum / 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]);
            }
        }
        return sum - dp[target] - dp[target];
    }
};

总结:

  • 要多写题才行,同样的题换个问法就不会了。

LeetCode 494- 目标和

题目链接:力扣

题目描述:给你一个非负整数数组 nums 和一个整数 target 。

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

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

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

解题思路

left代表正号数总和,right代表负号数总和,我们只需要找到对应的正号数left即可。

  1. 确定dp数组(dp table)以及下标的含义

dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法

  1. 确定递推公式

如果当前有数字1了,那我们目前就还有dp[j-1]种方法凑成dp[j].

有数字2,那就还有dp[j-2]种方法凑成dp[j]。

故是所有方法加起来

dp[j] += dp[j - nums[i]]

  1. dp数组如何初始化

没有数字也是一种方法

dp[0] = 1

  1. 确定遍历顺序

数字正序遍历,背包容量倒序遍历

  1. 举例推导dp数组
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) sum += nums[i];
        if (abs(S) > sum) return 0; // 此时没有方案
        if ((S + sum) % 2 == 1) return 0; // 此时没有方案
        int bagSize = (S + sum) / 2;
        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];
    }
};

总结:

  • 比上题在初始化的时候多了个石头,并且在进行dp更新时也先判断有没有石头,有就不更新(也就是0),没有就更新。

LeetCode 343- 整数拆分

题目链接:力扣

题目描述:给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

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

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

解题思路

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]

  1. 确定递推公式

从01背包转化而来,因为本题有两个维度,所以我们容量减去重量的时候是两个维度。并且我们 每次只会多一个子集。

dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

  1. dp数组如何初始化

因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。

  1. 确定遍历顺序

那么本题也是,物品就是strs里的字符串,背包容量就是题目描述中的m和n。

  1. 举例推导dp数组
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 默认初始化0
        for (string str : strs) { // 遍历物品
            int oneNum = 0, zeroNum = 0;
            for (char c : str) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            for (int i = m; i >= zeroNum; i--) { // 遍历背包容量且从后向前遍历!
                for (int j = n; j >= oneNum; j--) {
                    dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                }
            }
        }
        return dp[m][n];
    }
};

总结:

  • 二维的也需要明白,也就是多了一个维度

 

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

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

相关文章

Blazor : Component parameter should be auto property,无法修改get;set;

文章目录 Blazor 无法在get;set;里面定义方法 Blazor 无法在get;set;里面定义方法 Blazor Component组件 其实原因就是微软觉得你在get;set;里面放自定义逻辑&#xff0c;太容易出现无限父子回调的问题。如果你要在get时候进行某种逻辑&#xff0c;那你就在OnParameterSetAs…

归并排序 与 计数排序

目录 1.归并排序 1.1 递归实现归并排序&#xff1a; 1.2 非递归实现归并排序 1.3 归并排序的特性总结: 1.4 外部排序 2.计数排序 2.1 操作步骤: 2.2 计数排序的特性总结: 3. 7种常见比较排序比较 1.归并排序 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种…

Qgis统计面要素内点的数量,不同类型点的数量

简单&#xff1a; 统计面要素内点的数量。 工具栏直接搜索&#xff1a;统计点在多边形中的数量 统计面要素内不同类型点的数量。 查看QGIS-11 “按位置连接属性工具”——“按类别统计工具”——pandas透视表统计 数据透视表参考链接 参考链接&#xff1a; QGIS入门-9 统计面…

leetcode375. 猜数字大小 II(动态规划-java)

猜数字大小 II lc - 375 猜数字大小 II题目描述暴力递归 记忆化搜索代码演示动态规划 动态规划 lc - 375 猜数字大小 II 题目描述 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字&…

开学季 | 新生入学必备好物,快来看看你漏掉了哪些!

一转眼年就过完了&#xff0c;又到了开学季。有很多学生又要重新走进校园&#xff0c;开始自己的学生宿舍生活。作为一个从初中就开始住宿舍的过来人&#xff0c;有一些东西确实是我当时在学校里用过的&#xff0c;非常好用的神器&#xff0c;可以非常好的帮助我们生活、学习或…

界面组件DevExpress Reporting——支持图表本地化和可绑定属性

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 在最近的更新(v23.1)中&#xff0c;官方扩展了…

无脑入门pytorch系列(三)—— nn.Linear

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性&#xff0c;帮助企业降低运营成本、提高生产效率&#xff0c;并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响&#xff1a; …

手机图片怎么转换成pdf?这几个转换方法看看

手机图片怎么转换成pdf&#xff1f;如果你在手机上需要将一些图片转换成PDF文件&#xff0c;将图片转为PDF文档有多种优点。首先&#xff0c;PDF格式是一种通用的文件格式&#xff0c;可以在几乎所有设备上进行查看和打印&#xff0c;而且保留了原始文件的格式和布局。其次&…

为什么很多人认为ChatGPT最好的替代工具是Claude?

ChatGPT引领着生成式AI聊天机器人领域&#xff0c;但Claude AI看起来是一个有力的竞争者。 前段时间&#xff0c;ChatGPT的强劲竞争对手Claude2面世。当时很多人认为它可能会取代ChatGPT&#xff0c;在体验过一段时间之后&#xff0c;深以为然。原因如下&#xff1a; 更强大的…

使用vscode进行远程调试

官方调试手册&#xff1a;vscode官方调试手册 1.安装python扩展 如果是远程连接的话&#xff0c;一定要在ssh上启用扩展。不然创建基于python的配置文件时就会提示&#xff0c;无python扩展。 2.新建配置文件&#xff0c;并修改参数 点击左侧第四个按钮&#xff0c;运行与调试…

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用&#xff1a;JEE、MVC分布式应用&#xff1a;SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架&#xff0c;对专业知识&#xff08;序列化/反序列化、网络、多线程、设计模式、性能优化等&#xff09;进行了更高层的抽象和…

“new出对象“原理的深层解密

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

网络安全(自学)

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

数字鸿沟,让气候脆弱者更脆弱

随着科技的飞速发展&#xff0c;数字化正在改变我们的生活方式和社会结构。然而&#xff0c;数字鸿沟&#xff08;Digital Divide&#xff09;这一长期存在的问题&#xff0c;却在某些方面加剧了社会的不平等现象。在此&#xff0c;我们将探讨数字鸿沟如何加剧了气候脆弱者的脆…

帮助中心干货:7步即可在线搞定产品帮助中心!

在产品的生命周期中&#xff0c;帮助中心是一个非常重要的部分&#xff0c;它能够为用户提供必要的信息和解决方案&#xff0c;帮助他们更好地使用产品。如果你正在寻找一种简单高效的方法来在线搭建产品帮助中心&#xff0c;那么这篇干货文章将为你提供7个步骤&#xff0c;让你…

Spring Boot+Redis 实现一个简单的限流器示例

Spring BootRedis 实现一个简单的限流器&#xff0c;限制 文章目录 Spring BootRedis 实现一个简单的限流器&#xff0c;限制0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码优化后再优化一下加入布隆过滤器 4.总结5.参考文档6. Redis从入门到精通系列文章 0.前…

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子&#xff0c;比如野鸭、北京鸭、水鸭等。 鸭子有各种行为&#xff0c;比如走路、叫、飞行等。不同鸭子的…

跨境电商ERP源码选择指南:如何挑选最适合您的方案

在如今充满机遇的跨境电商领域&#xff0c;选择适合自己的ERP源码方案至关重要。然而&#xff0c;众多选择使得挑选变得棘手。作为跨境电商ERP源码领域的专家&#xff0c;我将揭示7个权威建议&#xff0c;帮助您在海量方案中快速、准确地找到最适合您的ERP源码。让我们一起深入…

元宇宙赛道加速破圈 和数软件抓住“元宇宙游戏”发展新风口

当下海外游戏市场仍然具备较大的增长空间。据机构预测&#xff0c;至2025年全球移动游戏市场规模将达1606亿美元&#xff0c;对应2020-2025年复合增长率11&#xff05;。与此同时&#xff0c;随着元宇宙概念持续升温&#xff0c;国内外多家互联网巨头纷纷入场。行业分析平台New…