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,...