【发布时间】:2016-03-26 23:46:12
【问题描述】:
我正在尝试通过动态编程解决标准的切杆问题。如发现here 和here,递归关系似乎是:
prices = [1..n]
array[1..n]
array[1] = prices[1]
for i in (2..n)
{
array[i] = INT_MIN
for j in (1..i-1)
{
array[i] = max(array[i],prices[j]+array[i-j])
}
}
而array[n] 返回n 的值,这就是我们的答案。我的问题就在这条线上
array[i] = max(array[i],prices[j]+array[i-j])
不应该
array[i] = max(array[i],array[j]+array[i-j])
假设我们正在尝试找到长度 8 的最大值。现在,对于4,我们发现我们通过切割单个长度单位4获得的值小于通过切割3和1的长度获得的值,即对于n = 4,prices[4]是不是最优的。但由于我们是自下而上构建结果数组,array[4] 是最优的。那么与prices[4]+array[4] 相比,array[4]+array[4] 不是n = 8 的最大值吗?我得到的解决方案如下所示:
prices = [1..n]
array[1..n]
for i in (1..n)
array[i] = prices[i] //prices[i] is the minimum value we can obtain by cutting it fully
for i in (2..n)
{
for j in (1..i-1)
{
array[i] = max(array[i],array[j]+array[i-j]) // find out all possible (j,i-j) pairs, and compare with array[i]
}
}
如果这不正确,请告诉我我在逻辑上犯了什么错误。
【问题讨论】:
-
你能在这里描述一下这个问题吗?究竟是什么切杆问题。
标签: arrays algorithm dynamic-programming