代码随想录动态规划——一和零

news2024/11/18 23:32:50

题目

给你一个二进制字符串数组 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”,“0001”,“1”,“0”} ,因此答案是 4 。
其他满足题意但较小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”} 。{“111001”} 不满足题意,因为它含 4
个 1 ,大于 n 的值 3 。

示例 2: 输入:strs = [“10”, “0”, “1”], m = 1, n = 1 输出:2 解释:最大的子集是 {“0”,
“1”} ,所以答案是 2 。

提示:

1 <= strs.length <= 600 1 <= strs[i].length <= 100 strs[i] 仅由 ‘0’ 和
‘1’ 组成 1 <= m, n <= 100

思路

本题仍然是01背包问题,因为strs数组里的元素,相当于就是物品,每个物品的个数都是一个,而m和n相当于是一个背包,两个维度的背包,不同的字符串长度就是不同大小的待装物品

典型的背包问题,只不过物品的重量有了两个维度

动规五部曲:

  1. 确定dp数组和下标的含义
    dp[i][j]表示最多有 i 个0和 j 个 1 的 strs 的最大子集的大小为dp[i][j]
  2. 确定递推公式
    dp[i][j] 可以从前一个strs里的字符串推导出来,strs里的字符串有zeros个0,有ones个1
    那么dp[i][j]就可以是dp[i - zeros][j - ones] + 1
    然后在遍历的时候,取dp[i][j]的最大值
dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)

这里实际上是三维,还有一个维度是第几个字符串,dp[i-1][][]dp[i][][],但是可以用滚动数组的思想,去掉这一维,类似于01背包的一维公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

  1. dp数组初始化
    01背包的dp数组初始化为 0 就可以,因为物品价值不会是负数,初始为0,可以保证递推的时候不会被dp[i][j]不会被初始值(0)覆盖,或者换个说法,保证一定会被背包价值覆盖
  2. 确定遍历顺序
    01背包一维公式遍历顺序,外层遍历物品,内层倒序遍历背包大小
  3. 举例推导dp数组
    以输入:[“10”,“0001”,“111001”,“1”,“0”],m = 3,n = 3为例
    最后dp数组的状态如下所示:
    在这里插入图片描述
    java代码如下:
class Solution{
	public int findMaxFornm(String[] s,int m, int n){
		//dp[i][j]表示i个0和j个1时的最大子集
		int[][] dp= new int[m+1][n+1];
		int ones,zeros;
		for(String str : strs){//遍历字符串数组中的每一个字符串,这里相当于遍历物品
			ones = 0;
			zeros = 0;
			for(char ch : str.toCharArray()){//将字符串str转化成字符数组,并用ch来遍历每一个字符
				if(ch == '0'){
					zeros++;
				} else {
					ones++;
				}
			}
			//倒序遍历背包容量,这里有两个维度表示容量
			for(int i = m; i >= zeros; i--){
				 for(int j = n; j >= ones; j--){
				 	dp[i][j] = Matn.max(dp[i][j], dp[i-zeros][j - ones] + 1);
				 }
			}
		}
		return dp[m][n];
	} 
}

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

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

相关文章

Oracle Unifier 系统架构简述(安装部署)

关于Oracle Primavera Unifier 的应用架构&#xff0c;其实在我之前的博客已有介绍相关内容 谈谈 Oracle P6 , Unifier 和其他应用系统间的联系https://campin.blog.csdn.net/article/details/104972949 从官方文档方面&#xff0c;其实在《unifier_performance_and_sizing_g…

【C语言】全面解析数据在内存中的存储

文章目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int、long、long long、float和doubole这些数据类型。这些数据类型也叫内置类型。 所占存储空…

JECloud微服务低代码平台重大发布。

JECloud微服务低代码平台【1.0.0】版升级发布&#xff0c;本次发布内容如下&#xff1a; JECloud微服务低代码平台是一款基于元数据领域模型构建的低代码开发平台&#xff0c;其底层采用微服务与微应用构建底层框架&#xff0c;并基于基础框架构建各核心微服务模块来实现低代码…

手撕七大排序 (四)

归并排序归并排序递归写法一. 基本概念二. 图解归并排序递归写法 一. 基本概念 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并…

数据结构与算法——链表(双向链表,顺序表与链表的比较)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.双向链表 二.双向链表的对称性&#xff1a;&#xff08;设指针p指向某一结点&#xff09; 1.双向链表的插入 2.双向链表的删除 …

浏览器中的页面循环系统

【】渲染进程中有个主线程处理安排好的任务&#xff0c;为了在线程运行过程中接收并处理新任务&#xff0c;引入了事件循环机制&#xff1b;为了处理其他线程发送来的任务&#xff0c;引入消息队列&#xff1b;为了处理其他进程发送来的任务&#xff0c;渲染进程专门有一个IO线…

【数据结构初阶】二、顺序表的实现

目录 一、线性表 二、顺序表 2.1 顺序表概念及结构 2.2 顺序表接口实现 2.2.1 顺序表初始化 2.2.2 顺序表的销毁 2.2.3 顺序表的打印 2.2.4 顺序表增加数据&#xff08;插入&#xff0c;头插、尾插&#xff09; 2.2.5 顺序表删除数据&#xff08;删除&#xff0c;头删…

Uniapp集成腾讯IM+音视频通话

腾讯IM(包含界面)源码下载相关配置 传送门&#xff1a;https://cloud.tencent.com/document/product/269/36887 传送门&#xff1a;https://github.com/TencentCloud/TIMSDK/tree/master/uni-app vue2 vue3都可 笔者用的vue2 解压文件 拖到编辑器 #项目右键 在命令行窗口打开 …

Promethues原理详解

目录 引言 一、Prometheus概念 1.1、什么是Prometheus 1.2、Zabbix和Prometheus区别 1.3、Prometheus的特点 二、运维监控平台设计思路 三、Prometheus监控体系 3.1、系统层监控&#xff08;需要监控的数据&#xff09; 3.2、中间件及基础设施类监控 3.3、应用层监控…

语音合成经典模型结构介绍

(以下内容搬运自 PaddleSpeech) Models introduction TTS system mainly includes three modules: Text Frontend, Acoustic model and Vocoder. We introduce a rule-based Chinese text frontend in cn_text_frontend.md. Here, we will introduce acoustic models and voc…

XDataverse免费的统一数据库管理工具

XDataverse产品简介 XDataverse是一款通用的数据库管理工具&#xff0c;主要管理关系型数据库&#xff0c;同时也支持一些其余类型的数据库&#xff0c;比如Redis。其主要功能有 支持主流关系型数据库的常规操作&#xff0c;比如MySQL,SQLServer,SQlite,SQLCE&#xff0c;Postg…

机器学习 逻辑回归(2)softmax回归多类别分类-鸢尾花案例

机器学习 逻辑回归之softmax回归多类别分类-鸢尾花案例一、前言二、假设函数三、One-Hot 独热编码四、代价函数五、梯度下降六、原生代码实现6.1 加载并查看数据6.2 添加前置与数据分割6.3 迭代训练6.4 验证数据七、sklearn代码实现八、参考资料PS&#xff1a;softmax回归损失函…

[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络&#xff08;RNN、LSTM&#xff09; 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步&#xff1a;配置activity_information.xml第二步&#xff1a;配置activity_registration.xml第三步&#xff1a;配置strings.xml第四步&#xff1a;配置InformationActivity第五步&#xff1a;配置RegistrationActivity第六步&#xff1a;运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 &#xff1a; 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷&#xff0c;DBSCAN具有强代表性&#xff0c;它是一个基于密度的聚类算法&#xff0c;最大的优点是能够把高密度区域划分为簇&#xff0c;能够在高噪声的条件下实现对目标的精准识别&#xff0c;但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年10月16日&#…

【电子技术基础(精华版)】直流稳压电路

前期我们了解了一些关于直流稳压电源的基础知识&#xff0c;为了更好地完善职教高考电子技术专业的需求&#xff0c;接下来我会更新【电子技术基础&#xff08;精华版&#xff09;】&#xff0c;从中可以让更多的职教高考生有效地复习。 由于本人是山东省的一位博主&#xff0…

3、SySeVR测试(上)

一、准备 1、将测试代码放在/home/test目录下&#xff1b; 2、将测试数据导入joern 在/home/SySeVR/joern-0.3.1查看是否存在.joernIndex文件&#xff0c;有的话&#xff0c;需要删除。 删除之后&#xff0c;将测试数据导入joern: java -jar /home/SySeVR/joern-0.3.1/bin/jo…

程序员的中年危机:那些能工作到45、50、60的程序员们,究竟具备了哪些能力?

程序员行业新技术发展迅猛&#xff0c;可以说是日新月异。也正是这个原因&#xff0c;中年危机成为我们必须面对和攻克的问题。 思考一个问题&#xff1a;那些能工作到45、50、甚至60的程序员们&#xff0c;究竟具备了哪些过人的能力&#xff1f; 就我过去的经历和观察来说&a…