|
@@ -0,0 +1,47 @@
|
|
|
+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
|
|
|
+}
|