給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。
你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 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)
classsolution
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 輸入 ...