題目描述:
有一根長度為 n 的木棍和一組切割位置 cuts。每次切割一段木棍的成本等於該段木棍的長度。你可以任意安排切割順序,求完成所有切割的最小總成本。
解題思路: 這是經典的區間 DP 問題。
cuts 排序,並在頭尾加上 0 和 n,形成新陣列 c = [0, cuts[0], cuts[1], ..., cuts[m-1], n]。dp[i][j] 為切割 c[i] 到 c[j] 這段木棍上所有切割點的最小成本。dp[i][j] = min(dp[i][k] + dp[k][j]) + (c[j] - c[i])。每次切割的成本是當前木棍的長度 c[j] - c[i]。dp[i][i+1] = 0(相鄰兩點間無切割點)。dp[0][m+1]。時間複雜度:O(m^3) — m 為切割點數量。三層迴圈(區間長度、左端點、中間點)。
空間複雜度:O(m^2) — DP 表格大小。
1. Sort cuts, prepend 0 and append n to form array c
2. Let sz = c.length
3. Create dp[sz][sz] initialized to 0
4. For len from 2 to sz-1:
For i from 0 to sz-len-1:
j = i + len
dp[i][j] = infinity
For k from i+1 to j-1:
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
dp[i][j] += c[j] - c[i]
5. Return dp[0][sz-1]記憶化遞迴(Top-Down):定義 solve(i, j) 為切割 c[i] 到 c[j] 的最小成本。遞迴搭配記憶化。邏輯等價,但遞迴可能更直觀。
Knuth 優化 O(m^2):利用 Knuth 的四邊形不等式優化,將最內層迴圈的搜尋範圍縮小。證明較複雜,但可將時間從 O(m^3) 降至 O(m^2)。