546.remove-boxes.go 930 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. const MAX_N int = 100
  2. var dp map[int]int
  3. var length []int
  4. func removeBoxes(boxes []int) int {
  5. n := len(boxes)
  6. dp = make(map[int]int)
  7. length = make([]int, n)
  8. for i := 1; i < n; i++ {
  9. if boxes[i] == boxes[i-1] {
  10. length[i] = length[i-1] + 1
  11. }
  12. }
  13. return dfs(boxes, 0, len(boxes)-1, 0)
  14. }
  15. func dfs(boxes []int, l, r, k int) int {
  16. // dp[l][r][k] = dp[l][r-1][0] + (k+1)^2, drop box[r]
  17. // = dp[l][p][k+1] + dp[p+1][r-1][0],
  18. // box[p] == box[j], remove boxes at [p+1, r-1] and attach
  19. // box[j] to box[p]
  20. if r < l {
  21. return 0
  22. }
  23. k += length[r]
  24. r -= length[r]
  25. key := ((l*MAX_N)+r)*MAX_N + k
  26. if val, ok := dp[key]; ok {
  27. return val
  28. }
  29. res := dfs(boxes, l, r-1, 0) + (k+1)*(k+1)
  30. for i := l; i < r; i++ {
  31. if boxes[i] == boxes[r] {
  32. res = maxInt(res, dfs(boxes, l, i, k+1)+dfs(boxes, i+1, r-1, 0))
  33. }
  34. }
  35. dp[key] = res
  36. return res
  37. }
  38. func maxInt(x, y int) int {
  39. if x < y {
  40. return y
  41. }
  42. return x
  43. }