用 Python 编写程序,查找切割木棍的最低成本
假设我们有一个值 n 和一个名为 cuts 的数组。假设有一根长度为 n 个单位的木棍。木棍的标签从 0 到 n。这里 cuts[i] 表示我们可以切割的位置。我们应该按顺序进行切割,但我们可以根据需要更改切割的顺序。这里 一次切割的成本是要切割的木棍的大小,总成本是所有切割成本的总和。我们必须找到切割的最小总成本。
因此,如果输入为 n = 7,切割 = [5,1,4,3],则输出将为 16,因为如果我们按 [3,5,1,4] 的顺序排列它们,则首先从长度 7 处切割 3,因此成本为 7,然后我们有两个长度为 3 和 4 的部分,然后在 5 处切割,因此成本为 4,到目前为止总计为 7+4=11,然后从大小为 2 的棍子处切割 4,因此总成本为 7+4+2 = 13,最后在 3 处切割,因此成本为 3,最终成本为 7+4+2+3 = 16。

为了解决这个问题,我们将遵循以下步骤 −
cuts := 一个列表,其中 cuts 中的元素按排序顺序排列,并在开头插入 0,在结尾插入 n
m := cuts 的大小
cost := 制作一个大小为 m x m 的方阵并用 0 填充
对于 k 在 2 到 m - 1 的范围内,执行
对于 i 在 0 到 m - 1 的范围内,执行
j := i + k
如果 j >= m,则
转到下一个迭代
cost[i, j] = (cuts[j] - cuts[i]) + (cost[i, s] + cost[s, j] 中的最小值,其中 s 在范围 (i+1, j-1) 内
返回 cost[0, m-1]
示例
让我们看看下面的实现以便更好地理解
def solve(n, cuts): cuts = [0] + sorted(cuts) + [n] m = len(cuts) cost = [[0]*m for _ in range(m)] for k in range(2, m): for i in range(m): j = i + k if j >= m: continue cost[i][j] = (cuts[j]-cuts[i]) + min(cost[i][s] + cost[s][j] for s in range(i+1, j)) return cost[0][m-1] n = 7 cuts = [5,1,4,3] print(solve(n, cuts))
输入
7, [5,1,4,3]
输出
16
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

