leetcode 5486 切棍子的最小成本

2021-10-08 23:53:59 字數 2469 閱讀 3314

5486. 切棍子的最小成本

有一根長度為 n 個單位的木棍,棍上從 0 到 n 標記了若干位置。例如,長度為 6 的棍子可以標記如下:

給你乙個整數陣列 cuts ,其中 cuts[i] 表示你需要將棍子切開的位置。

你可以按順序完成切割,也可以根據需要更改切割的順序。

每次切割的成本都是當前要切割的棍子的長度,切棍子的總成本是歷次切割成本的總和。對棍子進行切割將會把一根木棍分成兩根較小的木棍(這兩根木棍的長度和就是切割前木棍的長度)。請參閱第乙個示例以獲得更直觀的解釋。

返回切棍子的 最小總成本 。

示例 1:

輸入:n = 7, cuts = [1,3,4,5]

輸出:16

解釋:按 [1, 3, 4, 5] 的順序切割的情況如下所示:

第一次切割長度為 7 的棍子,成本為 7 。第二次切割長度為 6 的棍子(即第一次切割得到的第二根棍子),第三次切割為長度 4 的棍子,最後切割長度為 3 的棍子。總成本為 7 + 6 + 4 + 3 = 20 。

而將切割順序重新排列為 [3, 5, 1, 4] 後,總成本 = 16(如示例圖中 7 + 4 + 3 + 2 = 16)。

示例 2:

輸入:n = 9, cuts = [5,6,1,4,2]

輸出:22

解釋:如果按給定的順序切割,則總成本為 25 。總成本 <= 25 的切割順序很多,例如,[4,6,5,2,1] 的總成本 = 22,是所有可能方案中成本最小的。

2 <= n <= 10^6

1 <= cuts.length <= min(n - 1, 100)

1 <= cuts[i] <= n - 1

cuts 陣列中的所有整數都 互不相同

周賽的時候沒做出來,日常慚愧。這道題和戳氣球那道題非常想,只是做題的時候沒有想出來怎麼寫。

其實也是一樣的思路,和戳氣球一樣,那個是計算乘法,這個是計算加法。 dp[

i][j

]=mi

n(dp

[i][

j],d

p[i]

[k]+

dp[k

][j]

+cos

t(i,

j))dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+cost(i,j))

dp[i][

j]=m

in(d

p[i]

[j],

dp[i

][k]

+dp[

k][j

]+co

st(i

,j))

class

solution

:def

mincost

(self, n:

int, cuts: list[

int])-

>

int:

cuts.sort(

) cuts =[0

]+ cuts +

[n]

m =len(cuts)

cuts.sort(

)# print(cuts)

dp =[[

float

('inf')]

*m for _ in

range

(m)]

#相鄰切割點不能再分,損耗為0

for i in

range

(m):

for j in

range

(m):

if j == i+1:

dp[i]

[j]=

0for i in

range

(m-1,-

1,-1

):#i從下到上

for j in

range

(i+1

, m)

:# j 從左到右

if j - i >1:

#只有當i - j 中有裁剪點才進入

for k in

range

(i+1

,j):

dp[i]

[j]=

min(dp[i]

[j], dp[i]

[k]+dp[k]

[j]+cuts[j]

-cuts[i]

)#動態轉移方程

# print(dp)

return dp[0]

[-1]

leetcode刪除最外層的括號 1021

有效括號字串為空 a 或 a b,其中 a 和 b 都是有效的括號字串,代表字串的連線。例如,和 都是有效的括號字串。如果有效字串 s 非空,且不存在將其拆分為 s a b 的方法,我們稱其為原語 primitive 其中 a 和 b 都是非空有效括號字串。給出乙個非空有效字串 s,考慮將其進行原語...

LeetCode 1021 刪除最外層的括號

有效括號字串為空 a 或 a b,其中 a 和 b 都是有效的括號字串,代表字串的連線。例如,和 都是有效的括號字串。如果有效字串 s 非空,且不存在將其拆分為 s a b 的方法,我們稱其為原語 primitive 其中 a 和 b 都是非空有效括號字串。給出乙個非空有效字串 s,考慮將其進行原語...

LeetCode題庫練習之無重複字元的最長子串

參考自 題目描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。解題思路 運用滑動視窗的思想,從字串第乙個位置開始遍歷,當出現重複字元時,移除最左邊的字元。直至沒有重複的字元時停止。class solution lookup.insert s i maxstr max maxstr,...