动态规划算法应用之 切割木棍问题

切割木棍问题

给定一根长度为 n 英尺的木棍和一个价值数组 value[],数组中的第 i 个元素值 v 代表木棍长长度为 i 时,其价值为 v。现在要求将木棍切割成若干段,使得切割后所有木棍的价值总和最大。例如给定长度为 8 的木棍,对于下图的价值数组,当把它切割成两段长度为 2 和 6 的木棍时,两木棍的价值总和最大,为 22。

而对于同样的长度 8,如果价值数组如下,那么切割成 8 段长度为 1 的木棍时取得最大价值 24=3*8。

分析:先考虑只切割一次的情况,因为切割的位置只有 n 个(包括位置 0,即不切割),在每次切割后会得到两根木棍,它们的价值是确定的,所以可以比较出在 n 个切割位置中,哪个位置的切割得到的价值最大。切割得到的两木棍又可以这样递归的切割,每次选择取得最大价值的位置来切,最后就找到最大价值。所以有如下的切割递归公式

cutRod(n) = max(price[i] + cutRod(n-i-1)) for all i in {0, 1 .. n-1}

要注意在递归计算的过程中,会有很多重叠的子问题,为避免重复计算,我们可用一个维表存储各子问题的解。即我们用了 dp 算法。

如果不用 dp,直接暴力求解上面的递归式,则程序如下

C语言实现

#include
#include
 
// A utility function to get the maximum of two integers
i

你可能感兴趣的:(剑指offer-算法与数据结构)