algorithm - 棒切割算法的替代方法(递归)

标签 algorithm dynamic-programming

在 Introduction To Algorithms 一书中,解决切杆问题的朴素方法可以通过以下重现来描述:

令 q 是可以从长度为 n 的杆获得的最高价格。

让数组 price[1..n] 存储给定的价格。 price[i] 是长度为 i 的杆的给定价格。

rodCut(int n)
{
    initialize q as q=INT_MIN

    for i=1 to n
        q=max(q,price[i]+rodCut(n-i))

    return q
}

如果我使用以下方法解决它会怎样:

rodCutv2(int n)
{
   if(n==0)
     return 0

    initialize q = price[n]

    for i = 1 to n/2
        q = max(q, rodCutv2(i) + rodCutv2(n-i))

    return q
}

这种方法是否正确?如果是,为什么我们通常使用第一个?为什么更好?

注意: 我只关心解决这个问题的方法。我知道这个问题展示了最优子结构和重叠子问题,可以使用动态规划有效地解决。

最佳答案

第二个版本的问题是它没有使用价格数组。递归没有基本情况,所以它永远不会停止。即使您添加条件以在 n == 1 时返回 price[i],它也始终会返回将杆切割成尺寸为 1 的碎片的结果。

关于algorithm - 棒切割算法的替代方法(递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46756598/

相关文章:

swift - House Robber实现如何使用递归正确退出?

algorithm - 如何应对 Hackerrank 上的 Fair Cut 挑战?

algorithm - 优化 O(n^2) 算法所需的建议

具有 1 个参数的 C++ 默认模板化构造函数

algorithm - 寻找满足等式 1/x + 1/y = 1/n 且 x、y 和 n 为整数的不同对 {x, y}

algorithm - 制作 SOS 的最佳策略游戏

algorithm - 转到 : longest common subsequence to print result array

java - Dijkstra 算法 Java-- 距离不对

c - 使用指针写入 strend(s, t)(检查 `s` 是否以 `t` 结尾)

algorithm - 和为一的一半的幂