leetcode 546 移除盒子

2021-10-09 05:09:00 字數 2739 閱讀 8413

546. 移除盒子

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

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

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

示例:輸入:boxes = [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 <= boxes.length <= 100

1 <= boxes[i] <= 100

我們可以換一種思路,用 f(l, r, k) 表示移除區間 [l, r] 加上該區間右邊等於 a_r的 k個元素組成的這個序列的最大積分。例如序列 ,l = 1(下標從 1 開始),r = 5,那麼 f(l, r, 3) 對應的元素就是

\[6, 3, 6, 5, 6]}, 7, 6}, 6}, 8, 6} \}

中標記為紅色的部分。f(l, r, k) 的定義是移除這個紅色的序列獲得的最大積分。請注意此時我們約定 7 和 8 已經先被移除,所以在這個狀態下我們可以認為最後四個 6 是連續的,也就是說實際上序列是這樣的:

\,此時我們可以有這樣一些策略來移除盒子:

\ \color\}

,刪除後面的四個 6,再刪除前面的這個區間,這樣獲得的分數為 f(1

,4,0

)+42

f(1, 4, 0) + 4^2

f(1,4,

0)+4

2

\[6, 3}, 6]}, [5], 6, 6, 6, 6} \}

,刪除乙個 5,然後後面的 5 個 6 一起刪除,再刪除前面的橘黃色區間,這樣獲得的分數是 f(1

,2,5

)+f(

4,4,

0)

f(1, 2, 5) + f(4, 4, 0)

f(1,2,

5)+f

(4,4

,0)

\[ }6]},[3, 6, 5], 6, 6, 6, 6} \}

刪除 3、6、5 之後再刪除 5 個 6,這樣獲得的分數是 f(1

,1,5

)+f(

2,4,

0)

f(1, 1, 5) + f(2, 4, 0)

f(1,1,

5)+f

(2,4

,0)

動態轉移方程:

這個就是我們轉移的時候使用的策略,我們可以推導出這樣的動態規劃轉移方程:

f (l

,r,k

)=

max⁡

}\color f(l, r, k) = \max \begin f(l, r - 1, 0) + (k + 1)^2 \\ \max_^ \ \epsilon (a_i == a_r)} \} \} \end

f(l,r,

k)=max}​

當ai == ar的時候取1,否則取0

下面是**:

class

solution

:def

removeboxes

(self, boxes: list[

int])-

>

int:

n =len(boxes)

dp =[[

[0]*n for i_ in

range

(n)]

for _ in

range

(n)]

result = self.dfs(boxes, dp,

0, n-1,

0)return result

defdfs(self, boxes, dp, l, r, k)

:if l>r:

return

0if dp[l]

[r][k]!=0

:return dp[l]

[r][k]

#相當於是備忘錄,有值就直接返回

while r>l and boxes[r-1]

==boxes[r]

:#如果有和末尾r相同的元素,計數器加一,右邊界左移

r -=

1 k +=

1 dp[l]

[r][k]

= self.dfs(boxes, dp, l, r-1,

0)+(k+1)

**2#先計算下當前的狀態

for i in

range

(l, r)

:#在迴圈遍歷內部的狀態,把當前的狀態和內部狀態去乙個最大值,自頂向下求解

if boxes[i]

==boxes[r]

: dp[l]

[r][k]

=max

(dp[l]

[r][k]

, self.dfs(boxes, dp, l, i, k+1)

+self.dfs(boxes, dp, i+

1, r-1,

0))return dp[l]

[r][k]

Leetcode 546 移除盒子

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

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

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

546 移除盒子 動態規劃

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