546 移除盒子 動態規劃

2021-10-07 09:38:29 字數 1497 閱讀 9633

題目描述:

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

你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 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 個積分。當你將所有盒子都去掉之後,求你能獲得的最大積分和。示例 輸...