算法学习day43

算法学习day43

  • 1. 力扣1049. 最后一块石头的重量 II
    • 1.1 分析
    • 1.2 代码
  • 2. 力扣494. 目标和
    • 2.1 分析
    • 2.2 代码
  • 3. 力扣474.一和零
    • 3.1 分析
    • 3.2 代码
  • 4.参考资料

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

1.1 分析

动规五部曲
1.确定dp数组以及下标的含义
dp[j]表示容量为j的背包,最多可以背最大的重量为dp[j]

本题中石头的重量是stones[i],石头的价值也是stones[i]

2.确定递推公式
01背包的递推公式为:dp[j] = max(dp[j] , dp[j -weitght[i]] + value[i])

本题为:dp[j] = max(dp[j] , dp[j - stones[i]] + stones[i])

3.dp数组如何初始化
dp[j] 中的j表示容量,最大容量时多少?是所有石头重量的总和。

题目描述:1 <= stones.length <= 30 1 <= stones[i] <= 100, 最大重量30 * 100 = 3000。

dp数组开到1500即可

初始化dp[j],重量不为负数,dp[j]全部初始化为0即可

vector<int> dp(1501 , 0);

4.确定遍历顺序
如果使用一维dp数组,物品遍历在外背包遍历在内不能交换!内层for循环倒序遍历

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]);
    }
}

5.举例推导dp数组
在这里插入图片描述

1.2 代码

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        // 定义一个大小为1501的数组作为背包数组
        vector<int> dp(1501, 0);
        int sum = 0;
        // 遍历数组, 计算所有石头的总重量
        for(int i = 0 ; i < stones.size() ; i++){
            sum += stones[i];
        }
        // 计算背包容量,即总重量的一半
        int target = sum / 2;
        // 01背包
        for(int i = 0 ; i < stones.size(); i++){// 遍历物品
            for(int j = target; j>=stones[i]; j--){// 遍历背包
                // 递推公式:dp[j]表示背包容量为j时可以得到的最大价值
                // max(dp[j], dp[j - stones[i]] + stones[i])表示在不选当前石头时,背包容量为j时的最大价值。
                // 以及在选了当前石头时,背包容量为j时的最大价值。取二者之间的较大值,为当前背包容量下的最大价值。
                dp[j] = max(dp[j], dp[j-stones[i]] + stones[i]);
            }
        }
        return sum - dp[target] - dp[target];
    }
};

2. 力扣494. 目标和

2.1 分析

动规五部曲
1.确定dp数组以及下标的含义
假设加法总和x, 那么减法对应的总和为sum - x

所以我们求 x - (sum - x) = target

推导出: x=(target + sum) / 2

问题转换为装满容量为x的背包有几种方法

dp[j]: 装满容量为j的背包,有dp[j] 种方法

2.dp数组的递推公式
dp[j] 里面数j就是要求的大小。

举个栗子:dp[5] 5是要凑的大小。如果知道nums[i] = 1, 5 - 1= 4 , 按照1中的定义有dp[5-1]种方法凑成容量为5的背包

​ 如果知道nums[i] = 2, 5 - 2= 3 , 按照1中的定义有dp[5-2]种方法凑成容量为5的背包

​ 如果知道nums[i] = 3, 5 - 3= 2 , 按照1中的定义有dp[5-3]种方法凑成容量为5的背包

​ 如果知道nums[i] = 4, 5 - 4= 1 , 按照1中的定义有dp[5-4]种方法凑成容量为5的背包

​ 如果知道nums[i] = 5, 5 - 5= 0 , 按照1中的定义有dp[5-5]种方法凑成容量为5的背包

递推公式:dp[j] +=dp[j - nums[i]]

3.dp数组如何初始化
由递推公式可知:dp[0] = 1 在公式中,如果dp[0] = 0 ,那么递推结果将都是0.

4.dp数组遍历顺序
nums放在外循环,target内循环,且内循环倒序遍历。

5.举例推导dp数组

在这里插入图片描述

2.2 代码

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;                        // 如果目标值的绝对值超过数组元素和,无法得到方案,返回0
        if ((S + sum) % 2 == 1) return 0;                  // 如果目标值和数组元素和的和是奇数,无法得到方案,返回0
        int bagSize = (S + sum) / 2;                       // 计算背包大小
        vector<int> dp(bagSize + 1, 0);                    // 初始化动态规划数组
        dp[0] = 1;                                         // dp数组初始化
        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];                                // 返回得到目标值的方案数
    }
};


3. 力扣474.一和零

3.1 分析

动规五部曲
1.确定dp数组以及下标的含义
dp[i] [j]: 最多有i个0和j个1的strs最大子集的大小为dp[i] [j]

2.确定递推公式
dp[i] [j] 可以由前一个strs里的字符串推导出来,str里的字符串有zeroNum个0, oneNum个1。

dp[i] [j] 可以是dp[i - zeroNum] [j - oneNum] + 1;注意:前一个,所以加1。

然后在遍历的过程中,取dp[i] [j]的最大值。

递推公式:dp[i] [j] = max(dp[i] [j] , dp[i -zeroNum] [j - oneNum] + 1)

3.dp数组如何初始化
初始为0,保存递推的时候dp[i] [j] 不会被初始值覆盖

4.确定遍历顺序
外层for循环遍历物品,内层for循环遍历背包容量,且从后向前遍历。

本题中物品就是strs中的字符串,背包容量就是题目描述的m、n.

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);
        }
    }
}

5.举例推导dp数组
在这里插入图片描述

3.2 代码

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 创建一个 m+1 行,n+1 列的二维数组 dp,并初始化为 0
        for (string str : strs) {                              // 遍历字符串数组 strs,每个字符串作为一个物品
            int oneNum = 0, zeroNum = 0;                       // 统计当前字符串中 1 和 0 的个数
            for (char c : str) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            for (int i = m; i >= zeroNum; i--) {               // 遍历物品容量,从 m 到 zeroNum,且从后向前遍历
                for (int j = n; j >= oneNum; j--) {            // 遍历背包容量,从 n 到 oneNum,且从后向前遍历
                    // 计算状态转移方程:当前背包容量为 i 和 j 时,最多可以装多少个字符串
                    dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); 
                }
            }
        }
        return dp[m][n];                                       // 返回 dp[m][n],即背包容量为 m 和 n 时最多可以装多少个字符串
    }
};


4.参考资料

[代码随想录]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第⑦讲:Ceph集群RGW对象存储核心概念及部署使用

文章目录1.RadosGW对象存储核心概念1.1.什么是RadosGW对象存储1.2.RGW对象存储架构1.3.RGW对象存储的特点1.4.对象存储中Bucket的特性1.4.不同接口类型的对象存储访问对比2.在集群中部署RadosGW对象存储组件2.1.部署RGW组件2.2.集群中部署完RGW组件后观察集群的信息状态2.3.修改…

剑指offer JZ27 二叉树的镜像

Java JZ27 二叉树的镜像 文章目录Java JZ27 二叉树的镜像一、题目描述二、辅助栈三、递归法使用辅助栈和递归法解决剑指offer JZ27 二叉树的镜像的问题。 一、题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。   数据范围&#xff1a;二叉树的节点数 0≤n≤…

--编写一个存储过程,输入一个日期,返回该日期与当下日期的时间差,如果该差是负的,则提示该日期已经过去XX天,不然提示距离该日期还有xx天

--创建存储过程&#xff0c;一个输入参数&#xff0c;一个输出参数 create or replace procedure sp_minus(i_date varchar2,o_minus out varchar2) is --声明一个变量&#xff0c;用来存放异常 v_errm varchar2(200); begin --判断输入格式 if length(i_date)<>8 th…

Redis主从复制

文章目录定义用途怎么使用案例演示三大命令&#xff1a;修改配置文件细节常见方式一主二仆薪火相传反客为主复制原理和工作流程主从复制的缺点定义 主从复制&#xff0c;master以写为主&#xff0c;slave以读为主&#xff0c;当master数据变化的时候&#xff0c;自动将新的数据…

十分钟搞懂Java限流及常见方案

目录限流基本概念QPS和连接数控制传输速率黑白名单分布式环境限流方案常用算法令牌桶算法漏桶算法滑动窗口常用的限流方案Nginx限流中间件限流限流组件合法性验证限流Guawa限流网关层限流从架构维度考虑限流设计限流基本概念 QPS和连接数控制 传输速率 黑白名单 分布式环境…

HTML5 <abbr> 标签 和 HTML5 <applet> 标签

标签定义及使用说明 <abbr> 标签用来表示一个缩写词或者首字母缩略词&#xff0c;如"WWW"或者"NATO"。 通过对缩写词语进行标记&#xff0c;您就能够为浏览器、拼写检查程序、翻译系统以及搜索引擎分度器提供有用的信息。 实例 被标记的缩写词如…

《程序员面试金典(第6版)》面试题 08.04. 幂集(回溯算法,位运算,C++)不断更新

题目描述 幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入&#xff1a; nums [1,2,3] 输出&#xff1a; [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 解题思路与代码 其实…

博客让谷歌或是百度收录

参考以下大佬的博客教程 Hexo框架(六)&#xff1a;SEO优化及站点被搜索引擎收录设置 | 你真是一个美好的人类 第一步 安装百度和 Google 的站点地图生成插件&#xff1a; npm install hexo-generator-baidu-sitemap --save npm install hexo-generator-sitemap --save 然后来…

文件或目录损坏且无法读取错误的恢复方法

我们在日常的生活当中经常都会遇到各种各样的问题。比如有些时候将磁盘插入电脑之后突然跳出来一个“磁盘结构损坏且无法读取”的提示框&#xff0c;那么像这个情况该怎么解决呢?别着急&#xff0c;小编现在就将磁盘结构损坏且无法读取这个问题的解决方法来分享给你们 文件或目…

数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)

目录 用队列实现栈 题目描述 题目示例 核心思路 解题过程 定义结构体 创建栈结构体函数 入栈函数 出栈函数 取栈顶数据函数 判断栈是否为空函数 销毁栈函数 完整题解&#xff08;C语言&#xff09; 用栈实现队列 题目描述 题目示例 核心思路 完整题解…

计算机网络管理 ARP 地址解析协议 ARP的基础原理 Wireshark ARP 报文分析 ARP的通信过程

⬜⬜⬜ ---&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; (*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;---⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &#x1f381;欢迎各位→…

GPT4和ChatGPT的区别,太让人震撼

文 | Serendipity知乎 前言 GPT4上午朋友圈已经刷屏啦&#xff0c;不过我还在忙&#xff0c;刚刚才登上 GPT-4 &#xff0c;现在来体验一下~ 附 GPT-4 能力测试站&#xff08;无需魔法&#xff0c;仅供国内研究测试&#xff09;&#xff1a; https://gpt4test.com 附 Cha…

解决代码重复的优化方案

上周公司组织培训Spring 基于注解的数据校验方案&#xff0c;可以节省很大工作量&#xff0c;其实&#xff0c;除了数据校验&#xff0c;还有很多其他方案&#xff0c;可以大幅提高代码的整洁性。如&#xff1a;设计模式、OOP 思想、反射、泛型等等&#xff0c;框架往往需要以同…

强化学习下的多教师知识蒸馏模型(学习笔记

对知识蒸馏的方法提出了一个新的方向 采用多个不同的教师模型同时训练一个学生模型 一个很明显的好处 就是 多个教师model可以减少单个教师模型它的bias 但是当我们有多个老师的时候&#xff0c; 学生模型是否能够根据自己的能力选择和结合教师模型的特点 来选择性的向老师…

Maven依赖管理

文章目录一、mvn依赖的特性1. 依赖的范围2. 依赖的传递3. 依赖的排除二、mvn中的继承和聚合1. 聚合2. 继承3. Demo1、首先创建一个父工程并且修改它的打包方式为 pom2、创建子模块工程3、依赖管理三、企业级知识扩展1. 属性2. 版本管理3. 资源配置4. 多环境开发配置Maven工程约…

SWAT模型(高阶)

SWAT模型高阶十七项案例分析实践应用 导师&#xff1a;刘老师【副教授】&#xff1a;来自国内双一流高校&#xff0c;长期从事数字流域建模、流域水土过程模拟、遥感及GIS技术应用等领域工作&#xff0c;发表多篇SCI论文暨完成多项科研项目&#xff0c;具有资深的技术底蕴和专…

Python 01 初识python

目录 一、编程是怎么来到我们这个世界的&#xff1f; 二、Python的由来&#xff1f; 三、什么是python&#xff1f; 3.1面向对象和面向过程 3.1.1面向对象 3.1.2 面向过程 3.2解释性 3.2.1 编译性 3.2.2 解释性 3.3交互式 四、Python3和Python2 五、python和其他…

基于LiFePO4和硅/还原氧化石墨烯纳米复合材料的锂离子电池

A lithium-ion battery based on LiFePO4 and silicon/reduced graphene oxide nanocomposite highlights&#xff1a; 硅纳米颗粒(nSi)和还原氧化石墨烯(RGO)作为阳极&#xff1b;微波辐射&#xff0c;对混合物进行热处理&#xff0c;合成nSi/RGO复合物&#xff1b;通过不同充…

Jsoup使用教程以及使用案例

文章目录1&#xff1a;什么是Jsoup1&#xff1a;Jsoup概述2&#xff1a;Jsoup能做什么2&#xff1a;Jsoup相关概念3&#xff1a;获取文档1&#xff1a;导入jsoup的jar包2&#xff1a;从URL中加载文档对象&#xff08;常用&#xff09;3&#xff1a;从本地文件中加载文档对象4&a…

2023 海外工具站 3 月复盘

3 月的碎碎念&#xff0c;大致总结了商业人生、付费软件、创业方向选择、创业感性还是理性、如何解决复杂问题及如何成长这几个方面的内容。 商业人生 商业人生需要试错能力和快速信息收集与验证校准&#xff1b; 商业逻辑需要试错能力&#xff0c;收集各种渠道信息后整理决…
最新文章