我正在尝试从CLRS理解杆切割问题,我相信我已经理解了该方法。所以我在想,如果给我们一个价格数组,并且允许我们修改价格数组,我相信我们可以解决O(1)空间中的问题。我说得对吗?
这是我的方法。让我们考虑我们的数组为[1,5,8,9]
。我们假设最终的修改价格数组将包含长度为i
的每个棒的最高价格。让我们将最终修改后的价格数组称为dp
。
dp[n]
表示通过切割长度为n+1
的一根杆可获得的最大量。同样,由于dp[0]
表示通过切割长度为1
的一根棒可以获得的最大量,因此默认情况下其值为
dp[0] = arr[0]
让我们构造用于计算dp[3]
的递归树。
对于dp[3]
,我们需要计算max
和dp[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)
我认为可以进一步优化代码,以便第二个循环中的j
从0
到(i+1) / 2
。
我是否认为该算法的空间复杂度确实为O(1)正确吗?如果不是,为什么并且有人可以向我指出上述算法失败的输入?如果有人可以在这里帮助我,我将不胜感激。