【发布时间】:2020-07-19 13:39:02
【问题描述】:
我正在查看在 leetcode 上找到的此问题的解决方案。
问题说明:
给定一个数组
strs,其字符串仅由 0 和 1 组成。还 两个整数m和n。现在你的任务是找出你能找到的最大字符串数 用给定的
m0s 和n1s 的形式。每个0和1最多只能使用一次。
输入:
strs = ["10","0001","111001","1","0"]、m = 5、n = 3输出:
4
说明:这总共是4个字符串,可以用 5 个 0 和 3 个 1,分别是 "10","0001","1","0"。
用于解决问题的算法如下:
def findMaxForm(strs, m, n):
dp = [[0] * (n + 1) for _ in range(m +1)]
for s in strs:
zeros, ones = s.count('0'), s.count('1')
for i in range(m, zeros - 1, -1):
for j in range(n, ones -1, - 1):
# dp[i][j] indicates it has i zeros ans j ones,
# can this string be formed with those ?
dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])
# print(dp)
return dp[-1][-1]
问题中令人困惑的部分是dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])。我不确定这里发生了什么。为什么我们从零中减去 i,从一中减去 j?
我还找到了一个图表,它解释了 dp 表应如何查找数组中的任何元素。
我的问题:
- 第一个表代表什么? x 和 y 轴?为什么有这么多
1。我想如果我理解这部分,可能会点击。如果有人通过图表,我将不胜感激 - 为什么这种方式给了我们最大数量的
0's 和1's 可以形成?我想我仍然对这部分感到困惑dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])。 - 此外,该解决方案被描述为“针对 2D 空间优化的 3d-DP:dp[j][k]:i 维度被优化为就地使用”。这是什么意思?
【问题讨论】:
-
我知道
dp[i][j]正在做什么,但不知道为什么要这样做。例如,为什么01的第一个值可以分解为 1 个 0 和 1 个 1,为什么在 dp 表中没有第 0 行的地方到处都是全 1。第一个值代表什么表?你可以用 1 个零和 1 个 1 组成多少个字符串?第 2 行第 3 列的 1 表示什么?
标签: python algorithm data-structures dynamic-programming knapsack-problem