Leetcode 546 移除盒子

2021-09-24 14:50:05 字數 1540 閱讀 9531

給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。

你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子(k >= 1),這樣一輪之後你將得到 k*k 個積分。

當你將所有盒子都去掉之後,求你能獲得的最大積分和。

示例 1:

輸入:

[1, 3, 2, 2, 2, 3, 4, 3, 1]

輸出:

23 解釋:

[1, 3, 2, 2, 2, 3, 4, 3, 1]

----> [1, 3, 3, 4, 3, 1] (3*3=9 分)

----> [1, 3, 3, 3, 1] (1*1=1 分)

----> [1, 1] (3*3=9 分)

----> (2*2=4 分)

通過用 dp[i][j][k] 來表示通過移除boxes[i, j]中的箱子,且此時在boxes[i]前有k個箱子的顏色與boxes[i]的顏色相同時,可以獲得的最大分數。

此時,可以假設boxes陣列的長度是n,可以將結果表示為:

dp[0][n - 1][0]

而且此時有如下的一些初始狀態:

dp[i][i][k] = (k + 1) * (k + 1)

dp[i][j][k] = 0; //i < j

考慮一般的情況,對於 dp[i][j][k] 而言,考慮如何將其分解成子問題,以通過遞推來求解。

上面說到,dp[i][j][k] 表示的是通過移除boxes[i, j]中的箱子,且此時在boxes[i]前面有k個與boxes[i]顏色相同的箱子。因此,對於第i個箱子,如果將其和前面的k個箱子一起移除,那麼此時可以獲得的分數,可以表示為:

(k + 1) * (k + 1) + dp[i + 1][j][0]

同時對於第i個箱子,還有其他的方案來移除,即可以將boxes[i, j]中的某乙個箱子一起移除,這個箱子可以表示為boxes[m],此時boxes[m] == boxes[i]。此時可以獲得的分數,可以表示為:

dp[i + 1][m - 1][0] + dp[m][j][k + 1]

而此時的 dp[i][j][k] 就是這些情況下可以取得的最大值。

因此可以寫出狀態轉移方程如下:

temp1 = (k + 1) * (k + 1) + dp[i + 1][j][0]

temp2 = max(dp[i + 1][m - 1][0] + dp[m][j][k + 1]) //i <= m <= j && boxes[m] == boxes[i]

dp[i][j][k] = max(temp1, temp2)

class

solution

private

int removeboxessub(int boxes, int i, int j, int k, int

dp)

}dp[i][j][k] =res;

return

res;

}}

leetcode 546 移除盒子

546.移除盒子 給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 輸...

leetcode 546 移除盒子(動態規劃)

給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 1 輸入 1,3,2...

546 移除盒子 動態規劃

題目描述 給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 1 輸入 ...