UVa - 10003 解題紀錄
題目: UVa - 10003 - Cutting Sticks
題目說明
有一個可以切割木頭的工作台,若切割長度為 l 的木頭則需要消耗成本 l,且只能切割一個點,給一個木頭的長度及一些切割點,求將所有切割點都切割所需要的最小總成本。
Input: 每組測資第一個整數為 l
,為要切割的木頭總長度,若為 0 表結束。後面一個整數 n
,表有 n
個切割點,後面 n
個整數為切割點距離起始點的長度。
Output: 輸出將所有切割點都切割後的最小成本。
解題思路
我國文不太好,這題不知道怎麼用文字解釋,其實我也看不懂我在寫啥,建議直接看這篇比較快。
動態規劃題。
先讀取測資,使用 cut
數組儲存所有切割點,並將 l
放在最後面,0 放在最前面,為了方便,先在這裡將 n + 1
。
定義 dp[i][j]
表切割 切割點 i ( cut[i] )
及 切割點 j ( cut[j] )
中所有切割點的最小花費。
核心概念為,先從最小塊的木頭開始切割,找出最小塊的木頭需要消耗的成本,以此來算出大塊的木頭需要消耗的成本,將程式碼具體化來說,以 Sample I/O 的第一組測資舉例:
1 | 100 |
一開始木頭的長度為 100,成本為 100,若第一刀在 50 的地方切割,則
總成本 = ( 0 ~ 50 的木頭完全切割需要的最小成本 ) + ( 50 ~ 100 的木頭完全切割需要的最小成本 ) + ( 100 - 0 )
dp[0][4] = dp[0][2] + dp[2][4] + ( cut[4] - cut[0] )0 ~ 50 的木頭完全切割需要的最小成本 = ( 0 ~ 25 的木頭完全切割需要的最小成本 ) + ( 25 ~ 50 的木頭完全切割需要的最小成本 ) + ( 50 - 0 )
dp[0][2] = dp[0][1] + dp[1][2] + ( cut[2] - cut[0] )50 ~ 100 的木頭完全切割需要的最小成本 = ( 0 ~ 25 的木頭完全切割需要的最小成本 ) + ( 25 ~ 50 的木頭完全切割需要的最小成本 ) + ( 100 - 50 )
dp[2][4] = dp[2][3] + dp[3][4] + ( cut[4] - cut[2] )0 ~ 25 的木頭完全切割需要的最小成本 = 0
25 ~ 50 的木頭完全切割需要的最小成本 = 0
雖然想法是從上往下,但實際計算的時候需要從下往上計算,簡單來說,就是從小塊的木頭開始枚舉需要的成本,之後推到大塊的木頭,剩下的就看程式碼吧。
參考解法
1 |
|