首页 > 其他分享 >Leetcode 474 dp数组讲解和滚动数组优化

Leetcode 474 dp数组讲解和滚动数组优化

时间:2024-11-08 19:46:29浏览次数:1  
标签:w1 数组 strs int range 474 w0 Leetcode dp

474. 一和零

 

dp[i][w1][w2]:

  • DP 数组的集合:考虑前i个物品包括第i个,满足背包重量不超过[w1][w2]的所有集合
    把输入数组中的每个string当作是一个物品,其重量分别为string中0和1的个数

  • 属性:价值
    每个物品的价值是1因为我们求最大子集的个数,一个字符串对子集个数贡献的价值为1

  • 状态转移方程:

    •  

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        dp = [[[0] * (n + 1) for _ in range(m + 1)] for _ in range(len(strs) + 1)]

        #遍历每个物品
        for i in range(1, len(strs)  + 1):
            # Count the number of 0s and 1s in the current string as weight
            w0 = strs[i - 1].count("0")
            w1 = strs[i - 1].count("1")
            #遍历所有重量的集合
            for w_0 in range(m + 1): 
                for w_1 in range(n + 1):
                    if w_0 >= w0 and w_1 >= w1:# make sure the bag is large enough
                        dp[i][w_0][w_1] = max(dp[i - 1][w_0][w_1], dp[i - 1][w_0 - w0][w_1 - w1] + 1 )
                    else:
                        dp[i][w_0][w_1] = dp[i - 1][w_0][w_1]
                
        return dp[len(strs)][m][n]

  一刷错误:不能从 for w_0 in range(1,m + 1): 不然会少更新dp[i][0][1], dp[i][0][2]这些数组的

  • 滚动数组优化

    • class Solution:
          def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
              dp = [[0] * (n + 1) for _ in range(m + 1)]
      
              #遍历每个物品
              for i in range(1, len(strs)  + 1):
                  # Count the number of 0s and 1s in the current string as weight
                  w0 = strs[i - 1].count("0")
                  w1 = strs[i - 1].count("1")
                  #遍历所有重量的集合
                  for w_0 in range(m, w0 - 1,-1): # [include, include (parameter + 1), step]
                      for w_1 in range(n, w1 - 1, -1):
                          dp[w_0][w_1] = max(dp[w_0][w_1], dp[w_0 - w0][w_1 - w1] + 1 )
      
              return dp[m][n]
      
      
      

标签:w1,数组,strs,int,range,474,w0,Leetcode,dp
From: https://www.cnblogs.com/erinzlearningspace/p/18535814

相关文章

  • Intern大模型训练营(二):leetcode习题+Vscode连接InternStudio debug
    1.Leetcode383:思路:使用两个数组存储两个字符串中出现的字符,然后一一比较数量。classSolution:defcanConstruct(self,ransomNote:str,magazine:str)->bool:cnta=[0]*26cntb=[0]*26forcinransomNote:cnta[or......
  • 洛谷题单指南-二叉堆与树状数组-P1168 中位数
    原题链接:https://www.luogu.com.cn/problem/P1168题意解读:中位数就是位于中间的数,前1个数的中位数是第1个,前3个数的中位数是第2个,前5个数的中位数的第3个...以此类推。所以,此题本质上就是动态维护一组数,每1/3/5...等奇数个取第k小的数,取一次后k++。解题思路:要动态维护数据,且每......
  • 嵌入式课程day10-C语言数组
    目录七、数组7.1数组是什么?7.2数组的使用7.3定义数组7.4数组初始化7.5冒泡排序7.6二分法查找七、数组7.1数组是什么?存储多个同种类型的数据 ,方便数据处理7.2数组的使用先定义再使用7.3定义数组存储多少数据 数据的数据类型 数组名元素:数组中数据可以统......
  • Leetcode 3235. 判断矩形的两个角落是否可达
    1classSolution{2public:3boolcanReachCorner(intxCorner,intyCorner,vector<vector<int>>&circles){4vector<bool>visited(circles.size(),false);56function<bool(int)>dfs=[&](inti)......
  • 代码随想录算法训练营第二十一天| leetcode669. 修剪二叉搜索树、leetcode108.将有序
    1leetcode669.修剪二叉搜索树题目链接:669.修剪二叉搜索树-力扣(LeetCode)文章链接:代码随想录视频链接:你修剪的方式不对,我来给你纠正一下!|LeetCode:669.修剪二叉搜索树_哔哩哔哩_bilibili思路:目前想的是分三种情况,第一种情况就是这个数删除左边全部,第二种删除右边的全部,第......
  • 题解:3254. 长度为 K 的子数组的能量值
    Problem:3254.长度为K的子数组的能量值I题解:3254.长度为K的子数组的能量值给定一个数组nums和一个整数k,我们需要找出所有长度为k的子数组的“能量值”。根据题意:如果子数组是连续递增的,能量值等于子数组中的最大元素。否则,能量值为-1。以下是两种不同......
  • 找单独的数(获取数组中只出现一次的数)
    问题描述在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。要求:设计一个算法,使其时间复杂度为O(n),其中n是班级的人数。尽量减少额......
  • 代码随想录算法训练营第二十天|leetcode235. 二叉搜索树的最近公共祖先、leetcode701.
    1leetcode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)文章链接:代码随想录视频链接:二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili思路:用之前一样的方法,哈哈哈哈哈,好处就是做出来了,但是我觉得需......
  • LeetCode 2544[交替数字和]
    题目链接LeetCode2544[交替数字和]详情实例提示题解思路依次求出各位数字,然后进行计算循环找出各位数字:(循环体如下)  将数字对10取余得到对应位数的数字,加入到容器numVec  数字除以10,得到新的数字,此数字是不包含已获取数字的位数循环退出的条件:数字等于0循环......
  • golang 数组切片
    golang基础数组+切片packagemainimport( "fmt")//数组切片学习funcmain(){ //数组的初始化方式 nums1:=[3]int{1,2,3}//指定长度,全部初始化 fmt.Println("nums1:",nums1) nums2:=[5]int{1,2,3}//指定长度,部分初始化 fmt.Println("nums2:",nums2)......