日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

546. Remove Boxes 移除盒子

發布時間:2024/5/7 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 546. Remove Boxes 移除盒子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。
你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 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] (3*3=9 分) ----> [1, 3, 3, 3, 1] (1*1=1 分) ----> [1, 1] (3*3=9 分) ----> [] (2*2=4 分)

提示:

  • 1 <= boxes.length <= 100
  • 1 <= boxes[i]?<= 100

動態規劃

首先,假設我們拿到的 boxes 長這樣:

假設我們經過一系列操作后消掉了其中一些盒子:

對于這樣一個子序列,我們就可以記錄到dp數組里。我們可以操作的范圍是l到r的子序列。由于我們對每個子序列默認都是點擊boxes[r]來消除,因此要知道r的后面還連著幾個與boxes[r]相同顏色的盒子,記為k。如下圖,l = 0, r = 6, k = 2, 將其能獲得的最高得分記在dp[0][6][2]。

現在我們調用 calculatePoints(i, r, k) 來計算它的最高得分 dp[i][r][k]。

calculatePoints(i, r, k)

在我們這個子序列中,dp[0][6][2] 與 dp[0][5][3] 實際上是等價的。我們將r向左一直移動到不能再移動為止。

接著,我們計算出不同策略的得分,取最高分。

策略 1

我們可以直接點boxes[r],把最后4個盒子一次性消除,獲得16分!

剩下的盒子成為這樣一個子序列 dp[0][4][0]:

策略1得分:4*4 + dp[0][4][0]

策略 2

我們還可以把夾在中間的雜魚盒子都消掉,讓后面連起來的盒子數更多:

為了找到可以跟 boxes[r] 連起來的盒子,令 i = l:

i++

直到 boxes[i] == boxes[r],就說明我們搜索到了

在這個例子中,消掉雜魚盒子能獲得的分數是 dp[3][4][0]。

剩下的盒子的得分是 dp[0][2][4] 。

綜上,策略2得分:dp[0][2][4] + dp[3][4][0]

總結

為了取得一個子序列的最高得分,我們分不同策略,每種策略的得分可以看作是1~2個子子序列的最高分之和。

Code

def removeBoxes(self, boxes: List[int]) -> int:def dp(l, r, n):nonlocal memo, boxesif memo.get((l, r, n)):return memo[(l, r, n)]if l == r - 1:return (n + 1) * (n + 1)if boxes[l] == boxes[l + 1]:return dp(l + 1, r, n + 1)res = (n + 1) * (n + 1) + dp(l + 1, r, 0)for l2 in range(l + 2, r):if boxes[l2] == boxes[l]:res = max(res, dp(l + 1, l2, 0) + dp(l2, r, n + 1))memo[(l, r, n)] = resreturn resmemo = {}return dp(0, len(boxes), 0)

復雜度分析

  • 時間復雜度:O(n4)O(n^4)O(n4)。最壞情況下每個 f(l,r,k)f(l, r, k)f(l,r,k) 被計算一次,每次狀態轉移需要 O(n)O(n)O(n) 的時間復雜度。
  • 空間復雜度:O(n3)O(n^3)O(n3)dp\rm dpdp 數組的空間代價是 O(n3)O(n^3)O(n3),遞歸使用棧空間的代價為 O(n)O(n)O(n)

總結

以上是生活随笔為你收集整理的546. Remove Boxes 移除盒子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。