2024-03-27:用go语言,多维费用背包。

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

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1。

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

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。

输出:4。

答案2024-03-27:

来自左程云

灵捷3.5

大体步骤如下:

1.findMaxForm1 函数使用递归的方式实现。它遍历字符串数组 strs,将每个字符串中0和1的数量存储在一个二维数组 arr 中。然后通过递归函数 process1 进行计算,不断比较所选字符串是否符合要求,选择放入或不放入子集。该方法的时间复杂度为O(2^n),空间复杂度为O(n)。

2.findMaxForm2 函数使用记忆化搜索的方式实现。它也遍历字符串数组 strs 得到二维数组 arr,但使用三维数组 dp 进行记忆化,记录已经计算过的结果,避免重复计算。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

3.findMaxForm3 函数使用动态规划的方式实现。它从后向前遍历字符串数组 strs,得到二维数组 dp 来保存计算结果。通过比较选择当前字符串加入子集还是不加入子集,并更新动态规划数组 dp。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

4 findMaxForm4 函数使用动态规划的方式实现。它遍历字符串数组 strs,得到二维数组 dp 来保存计算结果。使用一维数组 dp 进行滚动更新,从后向前遍历,根据当前字符串的0和1的数量,更新动态规划数组 dp。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n)。

总时间复杂度:O(m * n * len(strs))

总额外空间复杂度:O(m * n * len(strs))

Go完整代码如下:

package main

import (
"fmt"
) var zeros, ones int func findMaxForm1(strs []string, m int, n int) int {
len := len(strs)
arr := make([][]int, len)
for i := 0; i < len; i++ {
zeroAndOne(strs[i])
arr[i] = []int{zeros, ones}
}
return process1(arr, 0, m, n)
} func process1(arr [][]int, i int, z int, o int) int {
if i == len(arr) {
return 0
}
p1 := process1(arr, i+1, z, o)
p2 := 0
if arr[i][0] <= z && arr[i][1] <= o {
p2 = 1 + process1(arr, i+1, z-arr[i][0], o-arr[i][1])
}
if p1 > p2 {
return p1
}
return p2
} func findMaxForm2(strs []string, m int, n int) int {
len := len(strs)
arr := make([][]int, len)
for i := 0; i < len; i++ {
zeroAndOne(strs[i])
arr[i] = []int{zeros, ones}
}
dp := make([][][]int, len)
for i := 0; i < len; i++ {
dp[i] = make([][]int, m+1)
for j := 0; j <= m; j++ {
dp[i][j] = make([]int, n+1)
for k := 0; k <= n; k++ {
dp[i][j][k] = -1
}
}
}
return process2(arr, 0, m, n, dp)
} func process2(arr [][]int, i int, z int, o int, dp [][][]int) int {
if i == len(arr) {
return 0
}
if dp[i][z][o] != -1 {
return dp[i][z][o]
}
p1 := process2(arr, i+1, z, o, dp)
p2 := 0
if arr[i][0] <= z && arr[i][1] <= o {
p2 = 1 + process2(arr, i+1, z-arr[i][0], o-arr[i][1], dp)
}
ans := p1
if p2 > p1 {
ans = p2
}
dp[i][z][o] = ans
return ans
}
func findMaxForm3(strs []string, m int, n int) int {
len0 := len(strs)
dp := make([][][]int, len0+1)
for i := len0; i >= 0; i-- {
dp[i] = make([][]int, m+1)
for z := 0; z <= m; z++ {
dp[i][z] = make([]int, n+1)
}
}
for i := len0 - 1; i >= 0; i-- {
zeroAndOne(strs[i])
for z := 0; z <= m; z++ {
for o := 0; o <= n; o++ {
dp[i][z][o] = dp[i+1][z][o]
if zeros <= z && ones <= o {
dp[i][z][o] = max(dp[i][z][o], 1+dp[i+1][z-zeros][o-ones])
}
}
}
}
return dp[0][m][n]
} func zeroAndOne(str string) {
zeros = 0
ones = 0
for i := 0; i < len(str); i++ {
if str[i] == '0' {
zeros++
} else {
ones++
}
}
} func findMaxForm4(strs []string, m int, n int) int {
dp := make([][]int, m+1)
for i := 0; i <= m; i++ {
dp[i] = make([]int, n+1)
}
for _, s := range strs {
zeroAndOne(s)
for i := m; i >= zeros; i-- {
for j := n; j >= ones; j-- {
dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1)
}
}
}
return dp[m][n]
} func max(a, b int) int {
if a > b {
return a
}
return b
} func main() {
strs := []string{"10", "0001", "111001", "1", "0"}
m := 5
n := 3 res1 := findMaxForm1(strs, m, n)
fmt.Println("findMaxForm1:", res1) res2 := findMaxForm2(strs, m, n)
fmt.Println("findMaxForm2:", res2) res3 := findMaxForm3(strs, m, n)
fmt.Println("findMaxForm3:", res3) res4 := findMaxForm4(strs, m, n)
fmt.Println("findMaxForm4:", res4)
}

Python完整代码如下:

# -*-coding:utf-8-*-

def zero_and_one(string):
zeros = 0
ones = 0
for char in string:
if char == '0':
zeros += 1
else:
ones += 1
return zeros, ones def find_max_form1(strs, m, n):
length = len(strs)
arr = []
for i in range(length):
zeros, ones = zero_and_one(strs[i])
arr.append((zeros, ones))
return process1(arr, 0, m, n) def process1(arr, i, z, o):
if i == len(arr):
return 0
p1 = process1(arr, i+1, z, o)
p2 = 0
if arr[i][0] <= z and arr[i][1] <= o:
p2 = 1 + process1(arr, i+1, z-arr[i][0], o-arr[i][1])
if p1 > p2:
return p1
return p2 def find_max_form2(strs, m, n):
length = len(strs)
arr = []
for i in range(length):
zeros, ones = zero_and_one(strs[i])
arr.append((zeros, ones))
dp = [[[-1] * (n+1) for _ in range(m+1)] for _ in range(length)]
return process2(arr, 0, m, n, dp) def process2(arr, i, z, o, dp):
if i == len(arr):
return 0
if dp[i][z][o] != -1:
return dp[i][z][o]
p1 = process2(arr, i+1, z, o, dp)
p2 = 0
if arr[i][0] <= z and arr[i][1] <= o:
p2 = 1 + process2(arr, i+1, z-arr[i][0], o-arr[i][1], dp)
ans = p1
if p2 > p1:
ans = p2
dp[i][z][o] = ans
return ans def find_max_form3(strs, m, n):
length = len(strs)
dp = [[[0] * (n+1) for _ in range(m+1)] for _ in range(length+1)]
for i in range(length-1, -1, -1):
zeros, ones = zero_and_one(strs[i])
for z in range(m+1):
for o in range(n+1):
dp[i][z][o] = dp[i+1][z][o]
if zeros <= z and ones <= o:
dp[i][z][o] = max(dp[i][z][o], 1 + dp[i+1][z-zeros][o-ones])
return dp[0][m][n] def find_max_form4(strs, m, n):
dp = [[0] * (n+1) for _ in range(m+1)]
for s in strs:
zeros, ones = zero_and_one(s)
for i in range(m, zeros-1, -1):
for j in range(n, ones-1, -1):
dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1)
return dp[m][n] strs = ["10", "0001", "111001", "1", "0"]
m = 5
n = 3 res1 = find_max_form1(strs, m, n)
print("findMaxForm1:", res1) res2 = find_max_form2(strs, m, n)
print("findMaxForm2:", res2) res3 = find_max_form3(strs, m, n)
print("findMaxForm3:", res3) res4 = find_max_form4(strs, m, n)
print("findMaxForm4:", res4)

2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n, 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个的更多相关文章

  1. 给定两个list A ,B,请用找出 A ,B中相同的元素,A ,B中不同的元素 ??

    A.B 中相同元素:print(set(A)&set(B)) A.B 中不同元素:print(set(A)^set(B))

  2. 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

    开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...

  3. 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

    // 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...

  4. hdu2159二维费用背包

    题目连接 背包九讲----二维费用背包 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物 ...

  5. 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...

  6. Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 洛谷 P1509 找啊找啊找GF(复习二维费用背包)

    传送门 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sq ...

  8. codevs1959拔河比赛(二维费用背包)

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人 ...

  9. 榨取kkksc03 luogu1855 dp 裸二维费用背包

    首先对于这个题目背景,,个人认为很(you)好(qu),,, 核心就是一个裸的二维费用背包,刚刚学习的同学参见dd大牛的背包九讲 #include <cstdio> #include &l ...

  10. hdu_2159(二维费用背包)

    HDU_2159 二维费用背包问题 http://acm.hdu.edu.cn/showproblem.php?pid=2159 #include<cstdio> #include< ...

随机推荐

  1. MySQL基础之DDL语句

    讲解SQL语句三大分类和每个分类的SQL使用入门. 使用的是数据库是:MySQL 8.0.27 1.SQL分类   DDL(Data Definition Language)语句:数据定义语句. 用途 ...

  2. 惠普HP519打印机缺色处理记录

    打印蓝色缺失, 黑色出墨不均匀 开盖检查, 发现蓝色墨水管路中间有断线, 拆开打印头后, 用随机器配的桔红色吸墨器吸墨. 之后重新开机还是缺色. 检查彩色打印头, 用浅浅的一层热水泡下方喷嘴, 黄色红 ...

  3. 【Android】使用Binder实现进程间通讯简单案例

    1 前言 使用AIDL实现进程间通讯简单案例 和 使用AIDL实现进程间传递对象案例 中介绍了使用 AIDL 进行进程间通讯,文中提到在编写完 aidl 文件(如:IMessageManager.ai ...

  4. redis大key分析工具redis-rdb-tools

    最近1台云Redis的内存曝高,24G的内存占用19G,而且一直增长,想看那些key比较大,腾讯云Redis有大key分析的结果,但是这台没有,估计要找腾讯云的技术刷新一下数据: 分析大key工具,有 ...

  5. js与java使用AES加密算法实现前后端加密解密

    AES加密算法入门:https://blog.csdn.net/IndexMan/article/details/87284833 第三方crypto.js下载地址:https://download. ...

  6. python课本学习-第二章

    chapter 2 编程基础 一.基本语法 1.注释 python注释以\("#"\)开始 多行注释使用三个单引号/双引号作为开始和结束标志 2.标识符与关键字 python命名时 ...

  7. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  8. Django多方式登录认证

    多方式认证原理 我们平常使用的Django登录认证是django.contrib.auth.authenticate 点进去源码,我们会看到这个函数,真正的认证类是它里面的那个 继续点进去源码,会看到 ...

  9. 问题:RuntimeError: Model class LuffyAPI.apps.user.models.UserInfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

    问题截图 报错原因 提示app未注册,但实际上已经注册的 1. # settings配置文件移动后要将这个settings添加到环境变量中 sys.path.insert(0, BASE_DIR) # ...

  10. 简单封装 Flurl

    FlurlHttpClient类 public class FlurlHttpClient { private readonly FlurlClient client; public FlurlHtt ...