1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- const MAX_N int = 100
- var dp map[int]int
- var length []int
- func removeBoxes(boxes []int) int {
- n := len(boxes)
- dp = make(map[int]int)
- length = make([]int, n)
- for i := 1; i < n; i++ {
- if boxes[i] == boxes[i-1] {
- length[i] = length[i-1] + 1
- }
- }
- return dfs(boxes, 0, len(boxes)-1, 0)
- }
- func dfs(boxes []int, l, r, k int) int {
- // dp[l][r][k] = dp[l][r-1][0] + (k+1)^2, drop box[r]
- // = dp[l][p][k+1] + dp[p+1][r-1][0],
- // box[p] == box[j], remove boxes at [p+1, r-1] and attach
- // box[j] to box[p]
- if r < l {
- return 0
- }
- k += length[r]
- r -= length[r]
- key := ((l*MAX_N)+r)*MAX_N + k
- if val, ok := dp[key]; ok {
- return val
- }
- res := dfs(boxes, l, r-1, 0) + (k+1)*(k+1)
- for i := l; i < r; i++ {
- if boxes[i] == boxes[r] {
- res = maxInt(res, dfs(boxes, l, i, k+1)+dfs(boxes, i+1, r-1, 0))
- }
- }
- dp[key] = res
- return res
- }
- func maxInt(x, y int) int {
- if x < y {
- return y
- }
- return x
- }
|