474. 一和零

给你一个二进制字符串数组 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

题解:

  • 此题是标准的背包问题,不过不同于传统背包问题,这里需要装的东西有两种,且他们的容量也是不同的,可以理解为有两个背包来装东西。
  • 因此我们设dp[i][j][k] 为在数组前i个数中选取元素,使得其选择的元素满足装够0的容量j,以及1的容量k的情况下的对应的子集的个数
  • 因此根据每次遍历得到的元素,我们先求出此元素所含有的0和1的个数zeros,ones后,根据其是否大于容量来判断其状态转移过程,因此有:

  • 且由于状态转移方程中出现了i-1,因此我们需要先确定好边界问题,因此对于所有的dp[0][j][k] 应该都初始化为0,因为长度为0。

代码:

class Solution {public int findMaxForm(String[] strs, int m, int n) {int l = strs.length;int[][][] dp = new int[l+1][m+1][n+1];for(int j=0;j<=m;j++){for(int k=0;k<=n;k++){dp[0][j][k] = 0;}}for(int i=1;i<=l;i++){for(int j=0;j<=m;j++){for(int k=0;k<=n;k++){int sum0 = cal(strs[i-1],'0');int sum1 = cal(strs[i-1],'1');if(sum0 > j || sum1 > k){dp[i][j][k] = dp[i-1][j][k];}else{dp[i][j][k] = Math.max(dp[i-1][j][k],dp[i-1][j-sum0][k-sum1]+1);}}}}return dp[l][m][n];  }public int cal(String s,char tar){//这里是转成字符数组遍历了,其实不转也可以char[] temp = s.toCharArray();int sum = 0;for(int i=0;i<temp.length;i++){if(temp[i]==tar){sum++;}}return sum;}
}

leetcode.474. 一和零---三维DP(双背包问题)相关推荐

  1. leetcode 474. 一和零(dp)

    给你一个二进制字符串数组 strs 和两个整数 m 和 n . 请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 . 如果 x 的所有元素也是 y 的元素,集 ...

  2. leetcode - 474. 一和零

    474. 一和零 -------------------------------------------- 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 ...

  3. LeetCode 474. 一和零(01背包动态规划)

    1. 题目 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 和 n 个 1.另外,还有一个仅包含 0 和 1 字符串的数组. 你的任务是使用给定的 m 个 ...

  4. LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零

    1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...

  5. 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零

    目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...

  6. LeetCode刷题day43|1049. 最后一块石头的重量 II、 494. 目标和、474.一和零

    文章目录 一.1049. 最后一块石头的重量 II 二.494. 目标和 三.474.一和零 一.1049. 最后一块石头的重量 II 这道题其实就与"分割子集"一样,就是先将总和 ...

  7. 474. 一和零 golang动态规划

    474. 一和零 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 和 n 个 1.另外,还有一个仅包含 0 和 1 字符串的数组. 你的任务是使用给定的 m ...

  8. day43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

    1049. 最后一块石头的重量 II 1.代码 class Solution { public:int lastStoneWeightII(vector<int>& stones) ...

  9. day36|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

    1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重 ...

  10. 【43天|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 】

    1049. 最后一块石头的重量 II dp[j] 表示j容量的背包可以背下石头的最大重量. class Solution {public:int lastStoneWeightII(vector< ...

最新文章

  1. SQL Server数据类型
  2. GHOST还原教程详细
  3. gitlab+jenkins+maven+docker持续集成(四)——Extended E-mail Notification配置
  4. Kubernetes — MACVLAN CNI
  5. Nginx-05:Nginx配置实例之反向代理2
  6. 2016计算机课程设计,2016年计算机组成原理课程设计-硬布线控制器的设计.doc
  7. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
  8. 企业运维笔试考题(1)
  9. Docker——Docker Compose
  10. BZOJ3172: [Tjoi2013]单词
  11. 企业申请CMMI3-CMMI5必经的六个阶段
  12. 数字电路-时序逻辑电路
  13. 傻瓜式激活win10,真的太简单了,一个3.3M小软件只有一个激活按钮,点一下就激活了。
  14. 防范WiFi探针嗅探敏感数据的保护方法
  15. 【Apache运维基础(5)】Apache的Rewrite攻略(2)
  16. 广义相对论和量子力学在哪些地方发生了严重的冲突(转)
  17. JavaScript面试题111-120
  18. 网络游戏的基本数据埋点和数据统计---2016/7/25
  19. xps文件的基本操作
  20. C语言/C++对编程学习的重要性!

热门文章

  1. nexus创建maven私服本地无法访问
  2. gnuplot常用命令(随时更新)
  3. 机器人图像识别要学习些什么_零售中的机器学习图像识别是什么?
  4. java设计模式精讲 第2章 UML急速入门
  5. javaweb JAVA JSP超市配送系统 物品配送网站jsp购物系统(电子商务网站,网上购物商城)在线购物源码
  6. 让你的照片动起来会说话源码
  7. SDN的优势及企业为什么要用SD-WAN
  8. 小功能⭐️Unity导出到手机后闪屏
  9. 寻找培育新ICT领域精英 华为云培训认证服务上线
  10. 移动WEB开发之rem布局--rem适配方案