当前位置: 首页 > news >正文

动态规划---一和零

题目:

给你一个二进制字符串数组 strs 和两个整数 mn

请你找出并返回 strs 的最大子集的长度,该子集中 最多m0n1

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

思路:

动态规划五部曲:

1.确定dp数组及含义

dp数组需要有两个维度,i来遍历数字0,j来遍历数字1。dp[i][j]表示最多有i个数字0,j个数字1时最大子集的长度。

2.确定递推公式

dp[i][j]可以由前一个str里的字符串推导出来,str里的字符串有zeroNum个0,oneNum个1

dp[i][j]就可以是dp[i-zeroNum][j-oneNum]+1

在遍历过程中取最大值,所以递推公式为dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)

3.dp数组初始化

全初始化为0即可。

4.确定遍历顺序

外层for正序循环遍历物品(字符串),内层for循环倒序遍历背包容量(m和n)。

5.举例推导dp数组

strs = ["10", "0001", "111001", "1", "0"], m = 3, n = 3

dp[i][j]=[[0,1,1,1],

             [1,2,2,2],

             [1,2,3,3],

             [1,2,3,3]]

代码:

    public int findMaxForm(String[] strs, int m, int n) {int[][] dp=new int[m+1][n+1];int zeroNum,oneNum;for(String s:strs){oneNum=0;zeroNum=0;for(char c:s.toCharArray()){if(c=='0')zeroNum++;elseoneNum++;}for(int i=m;i>=zeroNum;i--){for(int j=n;j>=oneNum;j--){dp[i][j]=Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);}}}return dp[m][n];}


http://www.mrgr.cn/news/20131.html

相关文章:

  • “解决MySQL容器启动后无法编辑文件的问题:实用指南“
  • 火山引擎VeDI赋能小城酒店业,助力“流量”向“留量”转化
  • 一种基于YOLOv10的高精度工业油污缺陷检测算法(原创自研)
  • kali——msfconsole的使用
  • 【计算机视觉前沿研究 热点 顶会】ECCV 2024中扩散模型有关的论文
  • 【Qt】Qt和JavaScript使用QWebChannel交互
  • 等保测评中的数据安全风险评估:企业实战
  • Linux:深入剖析计算机软硬件架构
  • 阿贝云免费虚拟主机和免费云服务器评测
  • 本地电脑交叉编译ffmpeg 到 windows on arm64
  • go程序解说
  • 没有35类可以做特许经营加盟不!
  • 字节内部培训的《大模型落地应用案例集》,52个大模型落地精选案例!
  • 前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
  • 全球主要论文知识库-学习资源
  • 比特币客户端和API
  • 体会循环---冒泡排序
  • CTFHub技能树-备份文件下载-网站源码
  • 05 C++语言---左值右值
  • 数据分析:R语言计算XGBoost线性回归模型的SHAP值