O(1)空间中的杆切割问题(动态编程)

时间:2018-11-26 11:37:33

标签: dynamic-programming

我正在尝试从CLRS理解杆切割问题,我相信我已经理解了该方法。所以我在想,如果给我们一个价格数组,并且允许我们修改价格数组,我相信我们可以解决O(1)空间中的问题。我说得对吗?
这是我的方法。让我们考虑我们的数组为[1,5,8,9]。我们假设最终的修改价格数组将包含长度为i的每个棒的最高价格。让我们将最终修改后的价格数组称为dp
dp[n]表示通过切割长度为n+1的一根杆可获得的最大量。同样,由于dp[0]表示通过切割长度为1的一根棒可以获得的最大量,因此默认情况下其值为
dp[0] = arr[0]
让我们构造用于计算dp[3]的递归树。
enter image description here

对于dp[3],我们需要计算maxdp[0] + dp[2], dp[1] + dp[1], dp[2] + dp[0]中的arr[3]。在这里,arr[3]等同于将杆保持其原始状态。
这是Python中解决该问题的代码。

arr = [1, 5, 8, 9]
n = len(arr)

for i in range(1, n):
    for j in range(i):
        arr[i] = max(arr[i], arr[j] + arr[i-j-1])
print(arr)  

我认为可以进一步优化代码,以便第二个循环中的j0(i+1) / 2
我是否认为该算法的空间复杂度确实为O(1)正确吗?如果不是,为什么并且有人可以向我指出上述算法失败的输入?如果有人可以在这里帮助我,我将不胜感激。

0 个答案:

没有答案