Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 94bdecf

Browse files
committed
添加474. 一和零 java 三维DP数组实现代码
1 parent e348823 commit 94bdecf

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

problems/0474.一和零.md

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,70 @@ public:
261261

262262
## 其他语言版本
263263

264-
265264
### Java
265+
266+
三维DP数组实现
267+
268+
```java
269+
class Solution {
270+
public int findMaxForm(String[] strs, int m, int n) {
271+
/// 数组有三个维度
272+
// 第一个维度:取前面的几个字符串
273+
// 第二个维度:0的数量限制(背包维度 1 容量)
274+
// 第三个维度:1的数量限制(背包维度 2 容量)
275+
int[][][] dpArr = new int[strs.length][m + 1][n + 1];
276+
277+
/// 初始化dpArr数组
278+
// 计算第一个字符串的零数量和1数量
279+
int zeroNum = 0;
280+
int oneNum = 0;
281+
for (char c : strs[0].toCharArray()) {
282+
if (c == '0') {
283+
zeroNum++;
284+
} else {
285+
oneNum++;
286+
}
287+
}
288+
// 当0数量、1数量都容得下第一个字符串时,将DP数组的相应位置初始化为1,因为当前的子集数量为1
289+
for (int j = zeroNum; j <= m; j++) {
290+
for (int k = oneNum; k <= n; k++) {
291+
dpArr[0][j][k] = 1;
292+
}
293+
}
294+
/// 依次填充加入第i个字符串之后的DP数组
295+
for (int i = 1; i < strs.length; i++) {
296+
zeroNum = 0;
297+
oneNum = 0;
298+
for (char c : strs[i].toCharArray()) {
299+
if (c == '0') {
300+
zeroNum++;
301+
} else {
302+
oneNum++;
303+
}
304+
}
305+
for (int j = 0; j <= m; j++) {
306+
for (int k = 0; k <= n; k++) {
307+
if (j >= zeroNum && k >= oneNum) {
308+
// --if-- 当0数量维度和1数量维度的容量都大于等于当前字符串的0数量和1数量时,才考虑是否将当前字符串放入背包
309+
// 不放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
310+
// 放入第i个字符串,需要在0维度腾出 zeroNum 个容量,1维度腾出 oneNum 个容量,然后放入当前字符串,即 dpArr[i - 1][j - zeroNum][k - oneNum] + 1)
311+
dpArr[i][j][k] = Math.max(dpArr[i - 1][j][k], dpArr[i - 1][j - zeroNum][k - oneNum] + 1);
312+
} else {
313+
// --if-- 无法放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
314+
dpArr[i][j][k] = dpArr[i - 1][j][k];
315+
}
316+
}
317+
}
318+
}
319+
return dpArr[dpArr.length - 1][m][n];
320+
}
321+
}
322+
```
323+
324+
325+
326+
二维DP数组实现
327+
266328
```Java
267329
class Solution {
268330
public int findMaxForm(String[] strs, int m, int n) {
@@ -682,3 +744,4 @@ public class Solution
682744
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
683745
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
684746
</a>
747+

0 commit comments

Comments
 (0)