2021-04-28:力扣546,移除盒子。给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。你将经过若干***作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k * k 个积分。当你将所有盒子都去掉之后,求你能获得的最大积分和。
福大大 答案2021-04-28:
动态规划。
代码用golang编写。代码如下:
package main import ( "fmt" ) func main() { arr := []int{2, 2, 2} ret := removeBoxes2(arr) fmt.Println(ret) } func removeBoxes2(boxes []int) int { N := len(boxes) dp := make([][][]int, N) for i := 0; i < N; i++ { dp[i] = make([][]int, N) for j := 0; j < N; j++ { dp[i][j] = make([]int, N) } } ans := process2(boxes, 0, N-1, 0, dp) return ans } func process2(boxes []int, L int, R int, K int, dp [][][]int) int { if L > R { return 0 } if dp[L][R][K] > 0 { return dp[L][R][K] } // 找到开头, // 1,1,1,1,1,5 // 3 4 5 6 7 8 // ! last := L for last+1 <= R && boxes[last+1] == boxes[L] { last++ } // K个1 (K + last - L) last pre := K + last - L ans := (pre+1)*(pre+1) + process2(boxes, last+1, R, 0, dp) for i := last + 2; i <= R; i++ { if boxes[i] == boxes[L] && boxes[i-1] != boxes[L] { ans = getMax(ans, process2(boxes, last+1, i-1, 0, dp)+process2(boxes, i, R, pre+1, dp)) } } dp[L][R][K] = ans return ans } func getMax(a int, b int) int { if a > b { return a } else { return b } }