/**
* 474. 一和零
* @author wsq
* @date 2020/10/11
计算机界中,我们总是追求用有限的资源获取最大的收益。
现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。
你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。
示例 1:
输入: strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出: 4
解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。
示例 2:
输入: strs = ["10", "0", "1"], m = 1, n = 1
输出: 2
解释: 你可以拼出 "10",但之后就没有剩余数字了。更好的选择是拼出 "0" 和 "1" 。
链接:https://leetcode-cn.com/problems/ones-and-zeroes
*/
package com.wsq.dp;
public class FindMaxForm {
/**
* 类似背包问题,不过这里是两个容器,按照原始的背包问题去解决的话
* 这里我们建立动态规划矩阵应该是个3维的,但是考虑到后一种情况的只和前一种情况的相关,
* 因此,这里将表示物品的维度给省略了
* @param strs
* @param m
* @param n
* @return
*/
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
for(String str: strs) {
int[] count = countZeroesAndOnes(str);
for(int i = m; i >= count[0]; i--) {
for(int j = n; j > count[1]; j--) {
dp[i][j] = Math.max(1 + dp[i-count[0]][j-count[1]], dp[i][j]);
}
}
}
return dp[m][n];
}
public int[] countZeroesAndOnes(String str) {
int[] ans = new int[2];
for(char c:str.toCharArray()) {
ans[c-'0']++;
}
return ans;
}
public static void main(String[] args) {
String[] strs = {"10", "0001", "111001", "1", "0"};
int m = 3;
int n = 2;
FindMaxForm fm = new FindMaxForm();
int ans = fm.findMaxForm(strs, m, n);
System.out.println(ans);
}
}
相关推荐
Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)
本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py和Pandas库,详细演示了如何高效读取HDF5格式文件、理解数据结构、提取关键特征(如传感器数据与剩余使用寿命RUL),并整合为可用于预测性维护分析的DataFrame,帮助研究者和工程师快速上手这一重要的工业时序数据集。
474. 一和零
2021-06-06 LeetCode每日一题 链接:https://leetcode-cn.com/problems/ones-and-zeroes/ 标签:动态规划、01背包问题 题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 输入:strs = ["10", "0001", "111001", "1", "0
解锁Cherry Studio高阶玩法:用MCP实现自动化测试与数据爬取
本文深入探讨了如何利用MCP协议与Cherry Studio结合,实现自动化测试与数据爬取的高阶应用。通过Playwright等工具的MCP集成方案,详细解析了自动化测试流水线构建和智能爬虫系统开发的关键技术,显著提升工程效率和系统适应性。
Leetcode 474. 一和零
474. 一和零 思路 典型的背包不超过容积的变种问题,相比于普通背包多了一维。 类比地,这样定义状态f[i,j,k]f[i, j, k]f[i,j,k]: 从前i个字符串中选,0的总数不超过j,1的总数不超过k的选取集合数的最大值。 由此可以得到状态转移方程: f[i,j,k]=Math.max(f[i−1,j,k],f[i−1,j−nums[i][0],k−nums[i][1]])f[i, j, k] = Math.max(f[i - 1, j, k], f[i - 1, j - nums[i][0],
算法-基于MACD的Adaboost股价涨跌预测模型
MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。
六轴机械臂正逆解计算
机械臂运动学就是。包括(Forward Kinematics)和(InverseKinematics)两部分。正运动学就是逆运动学则是关节变量->机械臂末端执行器的姿势=正向运动学机械臂未端执行器的位姿->关节变量=逆向运动学。
【LeetCode】动态规划—474. 一和零(附完整Python/C++代码)
一和零 是一个典型的 0-1 背包问题。给定若干个仅由 0 和 1 组成的二进制字符串,再给定两个整数 m 和 n,表示最多可以包含的 0 和 1 的数量。要求通过选取若干个字符串,使得这些字符串的总 0 和 1 的数量不超过 m 和 n,并且在这些条件下选取的字符串数量最多。
STM32CubeIDE之SHT3X温湿度传感器移植HAL库
有了前面的OLED的学习,这个学习起来也很快。 分以下几步走 1.你要有个温度传感器,SHT3X这个型号的,因为我要讲这个 2.你要有个STM32开发板(我用的是STM32L431RCT) 3.顺便找台电脑下载一个STM32CubeIDE 4.简单的找一个SHT3X的驱动,我是去某宝嫖的,一般卖这个的都有,这个驱动分两个文件,是.c和.h的,我直接把这两个放在下边 读了我上一篇的人,看这个应该很熟悉吧,一样的套路,学习方法是一样的,你就照搬就行 下面是sht3x.c的原文档,里面有个CRC..
动态规划:目标和/一和零
思路: 既然为target,那么就一定有 left组合 - right组合 = target。left + right等于sum,而sum是固定的。公式来了, 。target是固定的,sum是固定的,left就可以求出来。此时问题就是在集合nums中找出和为left的组合。 再回归到01背包问题,为什么是01背包呢?因为每个物品(题目中的1)只用一次!这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。本题则是装满有几种方法。其实这就是一个组合问题了。1确定dp数组以及下标的含义 d
从开票数据到 ML81N 一键过账:用 ABAP BAPI 批量创建 Service Entry Sheet 的落地方案
摘要:SAP ESM场景中,服务履约确认通常通过ML81N事务码创建服务条目表(SES)完成。本文介绍如何基于开票数据(VBRK/VBRP)自动生成SES:首先通过BAPI_PO_GETDETAIL获取采购订单服务行结构,然后使用BAPI_ENTRYSHEET_CREATE创建SES并覆盖开票数量与金额,最后调用BAPI_ENTRYSHEET_RELEASE自动释放。解决方案包含ALV交互界面、批量处理逻辑和结果跳转功能,实现从人工录入到自动化处理的转变。(149字)
基于YOLOv11的建筑图纸物体检测系统设计与实现
包含多种建筑平面图,标注了墙体、门窗等元素:CAD格式的建筑图纸数据集:专门针对建筑元素的标注数据集自定义数据集:使用LabelImg等工具自行标注的建筑图纸本文以FloorPlanDataset为基础,结合部分自定义标注数据构建混合数据集。wall (墙体)door (门)window (窗)stair (楼梯)furniture (家具)text (文字标注)dimension (尺寸标注)column (柱子)
155、【动态规划】leetcode ——474. 一和零:三维数组+二维滚动数组(C++版本)
如果是从小到大遍历的话,虽然第一次计算的结果会使i-1时的情况,但后续继续遍历时,由于j - zeros和k - ones可能会出现之前在i时遍历过程中已经被更新的情况,导致重复计数。而如果从大到小遍历的话,就可以保证每次遍历时都是按照i-1时的情况计算,并且在后续遍历时不会出现重复计数。,则该题就可以转化为01背包问题,其中m个0和n个1,可看作一个背包中两个不同维度的表示。本题是要在已有的字符串中,找到给定的m个0和n个1,组出最大的子集。因为一个字符串代表一个物品,其重量为1,
六种光耦综合对比——《器件手册--光耦》
可控硅输出光耦(SCR Optocoupler)是一种特殊的光电耦合器,由红外发光二极管(LED)和双向可控硅(SCR)组成,用于实现输入和输出之间的电气隔离和信号传输。逻辑输出光耦是一种高效、可靠的数字信号隔离和电平转换器件,通过电气隔离和逻辑电平输出,确保了系统的安全性和信号的稳定性。固态继电器(可控硅输出,SSR)是一种无触点电子开关设备,利用可控硅(SCR或Triac)作为主要开关元件,通过光耦合器实现输入和输出之间的电气隔离。光耦作为一种成熟的电气隔离器件,在电子电路设计中具有重要的地位。
刷题记录 动态规划-17: 474. 一和零
难度:中等给你一个的数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。true数组可以分割成 [1, 5, 5] 和 [11]。false数组不能分割成两个元素和相等的子集。
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
leetcode:474. 一和零[01背包][动态规划]
【代码】leetcode:474. 一和零[01背包][动态规划]
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
【LeetCode】474.一和零 #动态规划
【leetcode】474.一和零
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
力扣-动态规划-474. 一和零
力扣-动态规划-474. 一和零 494. 目标和 题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3 输出:4 解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“000
LeetCode 474.一和零 动态规划 一维dp(两个维度)
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。以输入:["10","0001","111001","1","0"],m = 3,n = 3为例。(5)遍历字符串数组,获取到"1",我们可以计算出x个"0" 和 y个"1"(6)遍历字符串数组,获取到"0",我们可以计算出x个"0" 和 y个"1"这就是一个典型的01背包问题!
Leetcode之动态规划(DP)专题-474. 一和零(Ones and Zeroes)
Leetcode之动态规划(DP)专题-474. 一和零(Ones and Zeroes) 在计算机界中,我们总是追求用有限的资源获取最大的收益。 现在,假设你分别支配着m个0和n个1。另外,还有一个仅包含0和1字符串的数组。 你的任务是使用给定的m个0和n个1,找到能拼出存在于数组中的字符串的最大数量。每个0和1至多被使用一...
动态规划 Leetcode 474 一和零
要点:1.背包容量为二维,物品重量为数组元素长度,价值为1;3.数组初始化也仿照01背包问题,没有负数则数组值初始化为0。2.仍是01背包问题,递推公式仿照。
代码随想录算法训练营day43|第九章 动态规划part05:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
还有一点,初始化dp数组的时候,必须将dp[0]设置为1,虽然总和为0的方法数不一定是1(例如集合[0, 0 ,0]),即使初始化为1,最后也可能会增加,但如果初始化为0,dp数组就永远都是0(因为遍历背包是倒序遍历,而且除0外所有都初始化为0,所以如果该容量存在方法数,那么一定是从dp[0]开始加起来的,dp[0]=0,那加来加去都只能是0)。这道题需要间接考虑,可以转化为能不能将整个数组尽量分成两个和一样的分数组,这样求最后的石头的质量就是求两个分数组的和之间的最小差值,就变成了和。
算法学习——LeetCode力扣动态规划篇3(494. 目标和、474. 一和零、518. 零钱兑换 II)
算法学习——LeetCode力扣动态规划篇3(494. 目标和、474. 一和零、518. 零钱兑换 II)
leetcode474. 一和零(动态规划-java)
其他满足题意但较小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”}。解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4。输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3。输入:strs = [“10”, “0”, “1”], m = 1, n = 1。解释:最大的子集是 {“0”, “1”} ,所以答案是 2。process(不选)
动态规划——01背包问题(力扣474: 一和零)
给定一个二进制字符串数组strs和两个整数m和n, 请找出并返回strs的最大子集长度, 该子集中最多有m个0和n个1(例如: strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3)
代码随想录 Day 41 | 【第九章 动态规划 part 04】1049. 最后一块石头的重量 II、494. 目标和、474.一和零
(1)定义dp数组及初始化:初始化一个二维动态规划数组 dp,大小为 (m+1) x (n+1),dp[i][j] 表示在至多有 i 个 '0' 和 j 个 '1' 的条件下,可以选择的最大字符串数量;(2)递推公式:本题中石头的重量就是石头的价值,递推公式为dp[j] = max(dp[j], dp[j-stones[i]]+stones[i])(4)dp数组递推公式:dp[i][j] = max(dp[i][j], dp[i-zero][j-one] + 1)
Leetcode 474. 一和零 动态规划 01背包问题
文章摘要 本文讨论了Leetcode 474题"一和零"的解法,这是一个二维背包问题的变种。题目要求在给定的字符串数组中选择一个子集,使得子集中0和1的总数分别不超过m和n,同时使子集尽可能大。文章提供了两种动态规划解法:1) 三维数组解法,使用dp[i][j][z]表示考虑前i个字符串时最多包含j个0和z个1的最大子集;2) 空间优化的二维数组解法,通过逆序更新避免覆盖。两种方法的时间复杂度均为O(lenmn),但第二种方法将空间复杂度从O(lenmn)优化到O(m*n)。
281



被折叠的 条评论
为什么被折叠?



