以最大增益顺序跳转 - 动态编程

时间:2016-11-25 13:38:46

标签: algorithm recursion dynamic-programming

我们有一系列项目1,...,n,每个项目都有一个分数(i)。如果我们选择一个项目,那么我们就不能选择i + 1,... i + rest(i)项目。目标是最大化总分。

我们可以通过动态编程解决这个问题。

对于第一项,我们有两个选择。或者选择它并转到其余(1)+ 1项或不选择它并转到第二项。

递归函数:

c[i] = max{ c[i - 1], c[i + rest(i) + 1] + score(i) }

这个递归函数的问题在于它在子问题之间创建了循环,这意味着子问题不是独立的。

我认为拥有像

这样的东西是理想的
c[i] = max{ c[i - 1], c[i - itemThatWentToItem(i)] + score(i) }

也许一个解决方案是拥有一个函数,它可以提供所有项目,这些项目会导致项目i,然后在它们之间取得最大分数。

另一个想法是将此问题转换为DAG中的最长路径,并为所有子图执行此操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

除了评论。是的,它可以通过递归实现,例如:

def C(i, n):
  if i > n:
    return 0
  return max(C(i+1, n), C(i+rest(i)+1)+score(i))
print C(0,n)

从后面计算值是最好的(最快的)。喜欢(注意:数组索引为1到n):

# initialize array with lot of zeros: length + max score(i)
cs = [0] * (n+max(rest(i) for i in range(0,n)+1)
for i in range(n, 0, -1):
  cs[i] = max(cs[i+1], cs[i+rest(i)+1]+score(i))
print cs[1]