題目描述:
給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。
你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 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] (33=9 分)
----> [1, 3, 3, 3, 1] (11=1 分)
----> [1, 1] (33=9 分)
----> (22=4 分)
方法1:動態規劃詳細**參考
主要思路:
(1)三維動態陣列dp[ i ][ j ][ k ]表示子元素組從 i到j 的右側有 k 個連續的和boxes[ j ]相同的顏色;
(2)對於每乙個dp[ i ][ j ],先從最右端找連續的相同的顏色,為k個,既dp[ i ][ j ][ k ],此時計算初值 dp[l][r][k]=dfs(boxes,l,r-1,0)+(k+1)*(k+1);既將最右側的k+1個消去後,加上前面的可能的處理結果;
(3)然後從左端開始逐個找與右側連續的箱子相同的顏色,既若boxes[i]==boxes[r],則相當於可以將原來的陣列分成兩組,既先將中間的從 i+1到r-1 的子陣列作為一組先消去, 既 dfs(boxes,i+1,r-1,0),再將剩下的作為乙個整體處理,既dfs(boxes,l,i,k+1),故此時dp[ i ][ j ][ k ]的值可以為dp[l][r][k]=dfs(boxes,l,i,k+1)+dfs(boxes,i+1,r-1,0); 從l 到 l遍歷重複 (3)中的過程,並和(2)中的結果結合,找出最大值;
class
solution
//若之前計算過,直接返回
if(dp[l]
[r][k]
>0)
return dp[l]
[r][k]
;//先計算(2)中的情況,既直接將最右邊的相同的箱子消去
dp[l]
[r][k]
=dfs
(boxes,l,r-1,
0)+(k+1)
*(k+1)
;//計算(3)中的情況,既在左邊的陣列中找出可以和右側連續的箱子結合的情形
for(
int i=l;i++i)
}//返回當前情形
return dp[l]
[r][k];}
intremoveboxes
(vector<
int>
& boxes)
};
leetcode 546 移除盒子(動態規劃)
給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 1 輸入 1,3,2...
Leetcode 546 移除盒子
給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 1 輸入 1,3,2...
leetcode 546 移除盒子
546.移除盒子 給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子 k 1 這樣一輪之後你將得到 k k 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 輸...