代码随想录算法训练营第四十三天 _ 动态规划_1049.最后一块石头的重量II、494.目标和、474.一和零。

学习目标:

动态规划五部曲:
① 确定dp[i]的含义
② 求递推公式
③ dp数组如何初始化
④ 确定遍历顺序
⑤ 打印递归数组 ---- 调试
引用自代码随想录!

60天训练营打卡计划!

学习内容:

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

该题目可以等效为一个重量和价值相等的01背包问题,所以使用一维的数组就可。

  • 本题中不好理解的点:为什么 sum - 2 * dp[target] 就一定是我们要求的结果?虽然事实告诉我就是如此。target作为数组重量和的平均值,(重量和价值相等),此时dp[target]的值(最大价值)一定也小于等于数组重量和的平均值(最接近平均值的值)。
  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 容量为j的背包的最大价值
    ② 求递推公式 : dp[j] = max(dp[j], dp[j-stones[i]] + stones[i])
    ③ dp数组如何初始化 : 全部为零
    ④ 确定遍历顺序 : 先遍历物品,再倒叙遍历背包。
class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for(int stone:stones){sum += stone;}int target = sum / 2;int itemSize = stones.length;int[] dp = new int[target+1];// 初始化// 递归函数for(int i = 0; i < itemSize; i++){for(int j = target; j >= 0; j--){if(j < stones[i])   dp[j] = dp[j];elsedp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);}// for(int num: dp){//     System.out.println(num + " ");// }}return sum - 2 * dp[target];}
}

494.目标和

如何转化为01背包问题呢。
假设加法的总和为x,那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) = target
x = (target + sum) / 2
此时问题就转化为,装满容量为x的背包,有几种方法。
这里的x,就是bagSize,也就是我们后面要求的背包容量。
------引用自代码随想录

  • 加法和的方法数 = 减法和的方法数 = 总的目标和的方法数,所以求加法和的方法数即是题目中目标和的方法数。

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 容量为j的背包有dp[j]种方法装满
    ② 求递推公式 : dp[j] += dp[j - nums[i]]
    | dp[j] | nums[i] | |
    |------- |-----------| |
    | dp[3] | 1 | dp[2]种方法凑成dp[3] |
    | dp[3] | 2 | dp[1]种方法凑成dp[3] |
    | dp[3] | 3 | dp[0]种方法凑成dp[3] |
    ③ dp数组如何初始化 : dp[0] = 1
    ④ 确定遍历顺序 : 先遍历物品,再倒叙遍历背包。

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;for(int num : nums){sum += num;}if((sum + target) % 2 == 1)  return 0;if(sum < Math.abs(target))    return 0;// 转化为01背包问题。int bagSize = (sum + target) / 2;int[] dp = new int[bagSize+1];// 初始化dp[0] = 1;// 递推公式for(int i = 0; i < nums.length; i++){// 背包for(int j = bagSize; j >= nums[i]; j--){dp[j] += dp[j - nums[i]];}// for(int d : dp){//     System.out.println(d + " ");// }// System.out.println("\n");}return dp[bagSize];}
}

474.一和零

  • 如何转化为01背包问题呢?
    最大子集的长度:可以被视为是背包里最多放几个物品。
    该物品的重量由两部分组成,所以必须使用二维数组。

  • 动态规划五步曲:
    ① 确定dp[i][j]的含义 : 装满i个0和j个1的背包最多能装dp[i][j]个物品。(所以用二维数组)
    ② 求递推公式 : dp[i][j] = max(dp[i][j] , dp[i-x][j-y] + 1)
    ③ dp数组如何初始化 : dp[0][j] = 0 dp[i][0] = 0
    ④ 确定遍历顺序 : 先遍历物品,再倒叙遍历背包(二维数组需要双循环)。

class Solution {// 背包里最多放几个物品,该物品的重量由两部分组成,所以必须使用二维数组public int findMaxForm(String[] strs, int m, int n) {int[][] dp = new int[m+1][n+1];// 初始化,默认都是0// 递推关系for(String str : strs){int x = 0;int y = 0;for(int k = 0; k < str.length(); k++){char ch = str.charAt(k);if(ch == '0')  x++;else y++;}for(int j = n; j >= y; j--){for(int i = m; i >= x; i--)dp[i][j] = Math.max(dp[i][j], dp[i-x][j-y]+1);}}return dp[m][n];}
}

学习时间:

  • 上午两个半小时,整理文档半小时。

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

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

相关文章

360公司-2019校招笔试-Windows开发工程师客观题合集解析

360公司-2019校招笔试-Windows开发工程师客观题合集 API无法实现进程间数据的相互传递是PostMessage2.以下代码执行后,it的数据为(异常) std::list<int> temp; std::list<int>::iterator it = temp.begin(); it = --it; 3.API在失败时的返回值跟其他不一样是 …

微信小程序自定义tabBar简易实现

文章目录 1.app.json设置custom为true开启自定义2.根目录创建自定义的tab文件3.app.js全局封装一个设置tabbar选中的方法4.在onshow中使用选中方法最终效果预览 1.app.json设置custom为true开启自定义 2.根目录创建自定义的tab文件 index.wxml <view class"tab-bar&quo…

自动升降压稳压电源模块输入3v~24V输出3.3/4.2/5/9/12V芯片

自动升降压稳压电源模块是一种高效、高稳定性的电源解决方案&#xff0c;广泛应用于各种需要稳定电压输出的场合。该模块采用宽电压低功耗方案&#xff0c;能够自动升降压&#xff0c;适应不同的输入电压范围&#xff0c;同时具有关断功能&#xff0c;确保设备的安全运行。 该电…

Vue 报错error:0308010C:digital envelope routines::unsupported

因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制 方法一 windows终端输入 set NODE_OPTIONS--openssl-legacy-provider 方法二 降低node版本&#xff0c;比如16. 方法三 package.json增加如下配置 "scripts":…

想要更高效的文件传输?这些aspera替代方案可以助你一臂之力

随着数字化时代的不断推进&#xff0c;数据传输已成为各行各业、各类企业所必需的核心能力。而在文件传输方面&#xff0c;传统的方式往往面临着诸多问题&#xff0c;例如文件大小限制、传输速度过慢、不稳定、不安全等问题。为此&#xff0c;许多企业开始寻找更可靠、更高效的…

Java大数据开发入门教程:使用Hadoop处理海量数据

引言&#xff1a; 随着互联网的发展和智能设备的普及&#xff0c;数据量的爆炸式增长已成为现实。如何高效地处理和分析这些海量数据成为了当今技术领域的一个重要课题。在大数据领域&#xff0c;Hadoop作为一个开源的分布式计算框架&#xff0c;被广泛应用于海量数据的存储和处…

网工学习10-IP地址

一、IP地址概念 IP地址是一个32位的二进制数&#xff0c;它由网络ID和主机ID两部份组成&#xff0c;用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段&#xff1b;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示&#xff0c;中间用…

XHR 和 Fetch 的区别

网站开发普遍采用前后端分离的模式&#xff0c;数据交互成为了不可或缺的关键环节。在这个过程中&#xff0c;XHR 和 Fetch API 是两种最常见的方法&#xff0c;用于从 Web 服务器获取数据。XHR 是一种传统的数据请求方式&#xff0c;而 Fetch API 则代表了现代 Web 开发的新兴…

scipy笔记:scipy.interpolate.interp1d

1 主要使用方法 class scipy.interpolate.interp1d(x, y, kindlinear, axis-1, copyTrue, bounds_errorNone, fill_valuenan, assume_sortedFalse) 2 主要函数 x一维实数值数组&#xff0c;代表插值的自变量y N维实数值数组&#xff0c;其中沿着插值轴的 y 长度必须等于 x 的…

Linux:使用pv实现执行进度监控

pv全称&#xff1a;Pipe Viewer&#xff0c;通过管道显示数据处理进度的信息 安装 yum install pv -y示例 复制文件 # 显示进度 pv data.sql > ./data-new.sql330MiB 0:00:00 [1.32GiB/s] [>] 100%限制mysql数据导出速率 mysqldump | pv -L10m > data.sql# -L, -…

gitlab注册无中国区电话验证问题

众所周知gitlab对中国区不友好&#xff0c;无法直接注册&#xff0c;页面无法选择86的手机号进行验证码发送。 Google上众多的方案是修改dom&#xff0c;而且时间大约是21年以前。 修改dom&#xff0c;对于现在的VUE、React框架来说是没有用的&#xff0c;所以不用尝试。 直接看…

Docker 安装 Nacos

Docker 安装 Nacos tags: docker Nacos 文章目录 Docker 安装 Nacostags: docker Nacos 下载镜像docker 运行命令说明 Nacos 端口说明 下载镜像 下载镜像 # 搜索镜像 docker search nacos # 下载镜像 dockers pull nacos/nacos-server创建挂载文件夹 # 存放日志 mkdir naco…

Linux结束程序运行的命令

kill 通过进程 ID&#xff08;PID&#xff09;结束一个程序的运行。例如&#xff0c;要结束进程 ID 为 1234 的进程&#xff1a; kill 1234 pkill 通过进程名称结束一个程序的运行。例如&#xff0c;要结束名称为example_process的进程&#xff1a; pkill example_process …

postman参数为D:\\audio\\test.mp3请求报错

报错信息 报错 java.lang.IllegalArgumentException: Invalid character found in the request target [/v1/audio/transcriptions?audioPathD:\\audio\\test.mp3 ]. The valid characters are defined in RFC 7230 and RFC 3986 解决方式 yml文件上放行指定字符 relaxed-pa…

Mac电脑每次修改完java的版本后,没有成功

问题&#xff0c;本地有多个java版本8,11,15,17但是每次执行代码后&#xff0c;版本没有变化。在环境变量文件.bash_profile中设置无效 export JAVA_HOME/Library/Java/JavaVirtualMachines/<Java版本目录>/Contents/Home 这个问题通常是由于系统默认使用的Shell不同导…

安装获取mongodb

目录 本地安装 获取云上资源 获取Atlas免费数据库 本地连接数据库 在Atlas中连接数据库 本文适合初学者或mongodb感兴趣的同学来准备学习测试环境&#xff0c;或本地临时开发环境。mongodb是一个对用户非常友好的数据库。这种友好&#xff0c;不仅仅体现在灵活的数据结构和…

力扣:191. 位1的个数(Python3)

题目&#xff1a; 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 J…

评论功能实现方案

构建高效且安全的评论功能&#xff1a;实现方案探讨。 1、分析 我们以b站的评论为例&#xff0c;用下图来解释我们评论的分级。 我们可以抽出存储评论的数据表属性 评论id父级id评论作者id被回复用户ID评论帖子ID评论内容创建时间 可以设计如下的数据表 其中pid表示父id。 …

考研失利后,我是如何零基础转行测试开发 ,成功拿下独角兽公司offer?

想当年&#xff0c;从一个什么都不懂的非科班测试小白&#xff0c;考研失利后&#xff0c;转行到K12教育知名互联网公司做测试开发工程师&#xff0c;我用了大概半年的时间。 这个过程中我自己也摸索出了一条学习路线&#xff0c;在这里想给大家分享一下我的学习路线&#xff…

EasyExcel list<Map>批量导出多个sheet

1 列表List<Map<String,Object>> list 按类型分模块分别导出到各自sheet 2 首先获取列表 List<Map<String,Object>> list tzBusiTaskUserListService.getTaskUserList(tzBusiTaskUserList); 3 分组 Map<String,List<Map<String,Object&g…