|
@@ -1,3 +1,41 @@
|
|
|
func findMaxForm(strs []string, m int, n int) int {
|
|
|
-
|
|
|
+ o := len(strs)
|
|
|
+ dp := make([][][]int, m+1)
|
|
|
+ for i := range dp {
|
|
|
+ dp[i] = make([][]int, n+1)
|
|
|
+ for j := range dp[i] {
|
|
|
+ dp[i][j] = make([]int, o+1)
|
|
|
+ }
|
|
|
+ } // dp[i][j][k] = max(dp[i][j][k-1], dp[i-dm][j-dn][k-1] + 1)
|
|
|
+ for i := 0; i <= m; i++ {
|
|
|
+ for j := 0; j <= n; j++ {
|
|
|
+ for k := 1; k <= o; k++ {
|
|
|
+ dm, dn := zeroAndOne(strs[k-1])
|
|
|
+ if dm <= i && dn <= j {
|
|
|
+ dp[i][j][k] = maxInt(dp[i][j][k-1], dp[i-dm][j-dn][k-1]+1)
|
|
|
+ } else {
|
|
|
+ dp[i][j][k] = dp[i][j][k-1] // Important!
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dp[m][n][o]
|
|
|
+}
|
|
|
+
|
|
|
+func zeroAndOne(s string) (zero, one int) {
|
|
|
+ for _, r := range s {
|
|
|
+ if r == '0' {
|
|
|
+ zero++
|
|
|
+ } else if r == '1' {
|
|
|
+ one++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func maxInt(x, y int) int {
|
|
|
+ if x < y {
|
|
|
+ return y
|
|
|
+ }
|
|
|
+ return x
|
|
|
}
|