474.ones-and-zeroes.go 792 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. func findMaxForm(strs []string, m int, n int) int {
  2. o := len(strs)
  3. dp := make([][][]int, m+1)
  4. for i := range dp {
  5. dp[i] = make([][]int, n+1)
  6. for j := range dp[i] {
  7. dp[i][j] = make([]int, o+1)
  8. }
  9. } // dp[i][j][k] = max(dp[i][j][k-1], dp[i-dm][j-dn][k-1] + 1)
  10. for i := 0; i <= m; i++ {
  11. for j := 0; j <= n; j++ {
  12. for k := 1; k <= o; k++ {
  13. dm, dn := zeroAndOne(strs[k-1])
  14. if dm <= i && dn <= j {
  15. dp[i][j][k] = maxInt(dp[i][j][k-1], dp[i-dm][j-dn][k-1]+1)
  16. } else {
  17. dp[i][j][k] = dp[i][j][k-1] // Important!
  18. }
  19. }
  20. }
  21. }
  22. return dp[m][n][o]
  23. }
  24. func zeroAndOne(s string) (zero, one int) {
  25. for _, r := range s {
  26. if r == '0' {
  27. zero++
  28. } else if r == '1' {
  29. one++
  30. }
  31. }
  32. return
  33. }
  34. func maxInt(x, y int) int {
  35. if x < y {
  36. return y
  37. }
  38. return x
  39. }