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 輸入 ...