一和零-动态规划474-python

news/2024/6/2 1:49:52 标签: 动态规划, leetcode, python

答案解析,可以转化为01背包问题,但因为有两个target,所以要用到三维dp数组。

python">from collections import Counter

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        nums0 = []
        nums1 = []
        length = len(strs)
        for s in strs:
            nums0.append(Counter(s)['0'])
            nums1.append(Counter(s)['1'])
        
        dp = [[[0] * (n+1) for _ in range(m+1)] for _ in range(length+1)]

        for i in range(1, length+1):
            for j in range(m+1):
                for k in range(n+1):
                    if j >= nums0[i-1] and k >= nums1[i-1]:
                        dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-nums0[i-1]][k-nums1[i-1]]+1)
                    else:
                        dp[i][j][k] = dp[i-1][j][k]
        
        return dp[-1][-1][-1]

同其他01背包问题一样,可以将三维dp数组替换为二维滚动dp数组,同样要注意背包遍历要倒序以防止重复添加物品

python">from collections import Counter

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        nums0 = []
        nums1 = []
        length = len(strs)
        for s in strs:
            nums0.append(Counter(s)['0'])
            nums1.append(Counter(s)['1'])
        
        dp = [[0] * (n+1) for _ in range(m+1)]

        for i in range(1, length+1):
            for j in range(m, -1, -1):
                for k in range(n, -1, -1):
                    if j >= nums0[i-1] and k >= nums1[i-1]:
                        dp[j][k] = max(dp[j][k], dp[j-nums0[i-1]][k-nums1[i-1]]+1)
                    else:
                        dp[j][k] = dp[j][k]
        
        return dp[-1][-1]

http://www.niftyadmin.cn/n/1541617.html

相关文章

测试 6

思路&#xff1a;将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 &#xff0c;那么无解 如果边数点数&#xff0c;那么贡献是 2 如果边数点数-1,那么贡献是点数 #include<queue> #include<cstdio> #include<iostream> #define N 100001 #de…

零钱兑换II-动态规划518-python

动态规划&#xff0c;完全背包问题。 class Solution:def change(self, amount: int, coins: List[int]) -> int:basecase: dp[0][0] 1 表示总金额为0时一个硬币也不拿是一种方式。state: dp[i][j]表示总金额为j&#xff0c;硬币为coins[0:i]时的组合数。transfer: 当总金…

组合总和IV-动态规划377-python

先举个例子&#xff0c;nums [1, 2, 3]&#xff0c;target 35. 假设用1&#xff0c;2&#xff0c;3拼凑出35的总组合个数为y。我们可以考虑三种情况&#xff1a; &#xff08;1&#xff09;有效组合的末尾数字为1&#xff0c;这类组合的个数为 x1。我们把所有该类组合的末尾…

Python开发:网络编程

Python 提供了两个级别访问的网络服务。&#xff1a; 低级别的网络服务支持基本的 Socket&#xff0c;它提供了标准的 BSD Sockets API&#xff0c;可以访问底层操作系统Socket接口的全部方法。高级别的网络服务模块 SocketServer&#xff0c; 它提供了服务器中心类&#xff0c…

c#/.net 基于文件流FileStream读写的文本操作小程序

FileStream对象表示在磁盘或网络路径上指向文件的流。 可以使用FileStream 类对文件系统上的文件进行读取、写入、打开、关闭等。 废话不说&#xff0c;开始操作。 1.拖好控件、必须滴&#xff0c;将除了要写文件的文本框外&#xff0c;其他的文本框的 ReadOnly 属性均设为 Tru…

完全平方数-动态规划279

没看答案&#xff0c;动态规划-完全背包问题。 import mathclass Solution:def numSquares(self, n: int) -> int:basecase: 初始化只考虑1的情况state: 由于int(sqrt(n))的的平方一定小于等于n&#xff0c;所以物品相当于candidate数组中的元素&#xff0c;背包重量为ndp[…

[置顶]信息发布系统 Jquery+MVC架构开发(6)BLL层提供WCF 服务

BLL层我们用wcf 来提供服务&#xff0c;这一层我们只对外只发布一个服务&#xff0c;为了使我们的代码可维护更好&#xff0c;我们引入抽象工厂模式。这样的话我们首先也创建三个接口&#xff1a;1&#xff09; IInfo InfoResult Add(Info info);InfoResult Update(Info info)…

单词拆分-动态规划139-python

没看答案&#xff0c;动态规划-完全背包问题。 from collections import defaultdictclass Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:basecase: dp[0]True表示背包重量为0时不拿物品也符合。state: dp[i]表示s[0:i]能否拼接出来。i可以理解为背…