forked from jsjtzyy/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLC474_OnesAndZeros.java
More file actions
40 lines (40 loc) · 1.13 KB
/
LC474_OnesAndZeros.java
File metadata and controls
40 lines (40 loc) · 1.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*;
/*
Dynamic programming (similar to knapsack problem)
m -- 0, n -- 1;
*/
public class LC474_OnesAndZeros {
public int findMaxForm(String[] strs, int m, int n) {
if(strs == null || strs.length == 0) return 0;
int len = strs.length;
int[] arr0 = new int[len];
int[] arr1 = new int[len];
int cnt0 = 0, cnt1 = 0;
for(int k = 0; k < len; ++k){
cnt0 = 0;
cnt1 = 0;
for(int i = strs[k].length() - 1; i >= 0; --i){
if(strs[k].charAt(i) == '0') {
++cnt0;
}else{
++cnt1;
}
}
arr0[k] = cnt0;
arr1[k] = cnt1;
}
int[][][] dp = new int[len + 1][m + 1][n + 1];
for(int i = 1; i <= len; ++i){
for(int j = 0; j <= m; ++j){
for(int k = 0; k <= n; ++k){
if(arr0[i - 1] <= j && arr1[i - 1] <= k){
dp[i][j][k] = Math.max(dp[i - 1][j][k], 1 + dp[i - 1][j - arr0[i - 1]][k - arr1[i - 1]]);
}else{
dp[i][j][k] = dp[i - 1][j][k];
}
}
}
}
return dp[len][m][n];
}
}