劃分型動態規劃 書籍複製

2021-10-18 23:02:40 字數 1845 閱讀 3465

給定 n 本書, 第 i 本書的頁數為 pages[i]. 現在有 k 個人來影印這些書籍, 而每個人只能影印編號連續的一段的書, 比如乙個人可以影印 pages[0], pages[1], pages[2], 但是不可以只影印 pages[0], pages[2], pages[3] 而不影印 pages[1].

所有人影印的速度是一樣的, 影印一頁需要花費一分鐘, 並且所有人同時開始影印. 怎樣分配這 k 個人的任務, 使得這 n 本書能夠被盡快影印完?

返回完成影印任務最少需要的分鐘數.

樣例 1:

輸入: pages = [3, 2, 4], k = 2

輸出: 5

解釋: 第乙個人影印前兩本書, 耗時 5 分鐘. 第二個人影印第三本書, 耗時 4 分鐘.

樣例 2:

輸入: pages = [3, 2, 4], k = 3

輸出: 4

解釋: 三個人各影印一本書.

挑戰時間複雜度 o(nk)

注意事項

書籍頁數總和小於等於2147483647

如果乙個抄寫員抄寫到第i本到第j本書,則需要時間a[i]+a[i+1] + … + a[j]。最後完成時間取決於耗時最長的那個抄寫員。因此需要找到一種分段方式,分成不超過k段,使得所有段的數字之和的最大值最小。

最後一步:最優策略中最後乙個抄寫員抄寫的部分。假設最後乙個抄寫員抄寫第j本到第n-1本書。則需要時間a[j]+……+a[n-1]。需要知道前面k-1乙個人最少需要多少時間抄寫完前j本書(第0~j-1本書)

因此我們可以假設f[k][i]為前k個抄寫員最少需要多少時間抄完前i本書

f[k][i]為前k個抄寫員最少需要多少時間抄完前i本書

初始條件:0個抄寫員只能抄0本書,所以f[0][0]=0,f[0][1]=f[0][2]=……

k個抄寫員需要0時間抄0本書,f[k][0]=0(k>0)

逐行計算,時間複雜度o(n*n*k),空間複雜度o(n*k),如果k>n,可以賦值n ->k

class

solution

:"""

@param pages: an array of integers

@param k: an integer

@return: an integer

"""defcopybooks

(self, pages, k)

:# write your code here

iflen

(pages)==0

:return

0 dp =[[

float

('inf')]

*(len(pages)+1

)for i in

range

(k +1)

] dp[0]

[0]=

0for i in

range(1

, k +1)

: dp[i][0

]=0for j in

range(1

,len

(pages)+1

):sum=

0for l in

range

(j,-1,

-1):

dp[i]

[j]=

min(dp[i]

[j],

max(dp[i -1]

[l],

sum)

)if l >0:

sum+= pages[l -1]

return dp[k]

[len

(pages)

]

劃分型動態規劃 解碼方法

一條包含字母 a z 的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。題目資料保證答案肯定是乙個 32 位的整數。示例 1 輸入 s 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 從題目的提問方式能夠很明顯的看...

動態規劃 劃分型 能量項鍊

能量項鍊 總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於...

天梯 劃分型動態規劃 1017 乘積最大

題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...