1234567891011121314151617181920212223242526272829303132333435363738394041 |
- 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
- }
|