前往
大廳
主題

LeetCode - 1547. Minimum Cost to Cut a Stick 解題心得

Not In My Back Yard | 2024-03-09 12:00:20 | 巴幣 0 | 人氣 44

題目連結:


題目意譯:
(譯者注:在本題中我將保留英文原文敘述,格式將會是一段英文接一段中文譯文。真的是相當「精彩」的敘述,我不知道要怎麼吐槽。)

Given a wooden stick of length n units. The stick is labelled from 0 to n. For example, a stick of length 6 is labelled as follows:
直譯譯文:
給定一根長度為 n 單位長的木棍。木棍會被從 0 編號到 n。例如說,一根長度為 6 的木棍將會如下編號:

「修正」後的譯文:
給定一根長度為 n 單位長的木棍。該木棍會被分成 n 個區域,其中每個區域等長。而棍子的開頭、結尾以及每個區域之間的分界線將會依序編號為 0 到 n。例如說,一根長度為 6 的木棍將會如下編號:



Given an integer array cuts where cuts[i] denotes a position you should perform a cut at.
給定一個整數陣列 cuts,其中 cuts[i] 代表著你應下刀的其中一個位置。



You should perform the cuts in order, you can change the order of the cuts as you wish.
直譯譯文:
你應按照順序下刀,你可以隨意改變下刀的順序。

「修正」後的譯文:
你可以按任意順序來為給定的位置們下刀。



The cost of one cut is the length of the stick to be cut, the total cost is the sum of costs of all cuts. When you cut a stick, it will be split into two smaller sticks (i.e. the sum of their lengths is the length of the stick before the cut). Please refer to the first example for a better explanation.
直譯譯文:
一次下刀的成本為下刀時木棍的長度,而總成本為每一次下刀的成本之總和。當你下刀去切一根木棍時,它將分成兩段較小的木棍(即它們的長度和為下刀前的木棍長度)。請參見第一個範例來得到更好的解釋。

「修飾」後的譯文:
一次下刀的成本為下刀時木棍的長度,而總成本為每一次下刀的成本之總和。當你下刀去切一根木棍時,它將從切點分為兩段較短的木棍(即它們的長度和為下刀前的木棍長度)。



Return the minimum total cost of the cuts.
回傳最小總成本。

限制:
2 ≦ n ≦ 10 ^ 6
1 ≦ cuts.length ≦ min(n - 1, 100)
1 ≦ cuts[i] ≦ n - 1
cuts 中所有整數彼此相異。



範例測資:
範例 1:
輸入: n = 7, cuts = [1,3,4,5]
輸出: 16
解釋: 若按照輸入給定的順序來作為下刀順序 = [1, 3, 4, 5],則將會得到下列情況:
(譯者注:原本敘述時是用「stick」指稱木棍,不過這邊變成了「rod」。但比起其他敘述上的瑕疵,這邊無傷大雅。)
第一次下刀時的木棍長度為 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,而其為所有可能中的最小值。


解題思維:
基本上就是這題。注意到該題的作法時間複雜度是 O(m ^ 3) 而非 O(n ^ 3),其中 m 為 cuts 的長度。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作