我一直在尝试理解动态编程,但是对于每个新问题,我对如何为它编写递归感到困惑。
采取以下问题: 有一个L×H金属板,可以通过机器切割成垂直或水平两件.L,H是整体,切口也沿整数值发生。有n个矩形图案l(i)×h( i),i≤n(l,h也是积分),其中第i个模式具有pro c c(i)。设计一种高效的算法,以某种方式切割纸张,从而最大限度地提高总体利润。
现在我想解决这个问题,我们会创建一个LxH表(它将以diaganally方式填充)。但是我们如何形成一个递归来解决这个问题?
答案 0 :(得分:2)
我会为每个T(L,H)尝试类似的东西,验证之间的最佳选择:
类似的东西:
T(L, H) = max(
c(L, H),
T(i, H)+T(L-i, H), // 0<i<L
T(L, i)+T(L, H-i) // 0<i<H
)
答案 1 :(得分:1)
我不明白为什么你真的想在有dp-relation时使用递归。回溯 - 递归通常非常低效,因为其复杂度通常为O(2 ^ N)或更高。
然而,那些指数算法非常类似:
function rec(state)
if state = end
return
Choose the current element
rec(state + 1)
Don't choose the current element
rec(state + 1)
在你的情况下,这可能就像这个蛮力:
function rec(rect r)
if r is empty
return 0
Max = 0
for i = 1 to r.width
for j = 1 to r.hight
rect g = cut(r, i, j)
Max = max(Max, profit(g) + rec(r - g))
return Max