1. 程式人生 > >[Swift]LeetCode546. 移除盒子 | Remove Boxes

[Swift]LeetCode546. 移除盒子 | Remove Boxes

獲得 fun xpl with etc 表示 repr res same

Given several boxes with different colors represented by different positive numbers.
You may experience several rounds to remove boxes until there is no box left. Each time you can choose some continuous boxes with the same color (composed of k boxes, k >= 1), remove them and get k*k points.
Find the maximum points you can get.

Example 1:
Input:

[1, 3, 2, 2, 2, 3, 4, 3, 1]

Output:

23

Explanation:

[1, 3, 2, 2, 2, 3, 4, 3, 1] 
----> [1, 3, 3, 4, 3, 1] (3*3=9 points) 
----> [1, 3, 3, 3, 1] (1*1=1 points) 
----> [1, 1] (3*3=9 points) 
----> [] (2*2=4 points) 

Note: The number of boxes n would not exceed 100.


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

Runtime: 1784 ms Memory Usage: 21.6 MB
 1 class Solution {
 2     func removeBoxes(_ boxes: [Int]) -> Int {
 3         var n:Int = boxes.count
 4         var dp = [[[Int]]](repeating: [[Int]](repeating: [Int](repeating: 0, count: n), count: n), count: n)
 5         for i in 0..<n
 6         {
 7             for k in 0...i
 8             {
 9                 dp[i][i][k] = (1 + k) * (1 + k)
10             }
11         }
12         for t in 1..<n
13         {
14             for j in t..<n
15             {
16                 var i:Int = j - t
17                 for k in 0...i
18                 {
19                     var res:Int = (1 + k) * (1 + k) + dp[i + 1][j][0]
20                     for m in (i + 1)...j
21                     {
22                         if boxes[m] == boxes[i]
23                         {
24                             res = max(res, dp[i + 1][m - 1][0] + dp[m][j][k + 1])
25                         }
26                     }
27                     dp[i][j][k] = res
28                 }
29             }
30         }
31         return n == 0 ? 0 : dp[0][n - 1][0]
32     }
33 }

[Swift]LeetCode546. 移除盒子 | Remove Boxes