【发布时间】:2017-04-09 22:27:14
【问题描述】:
我们有一个项目序列 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 中的最长路径,并对所有子图执行此操作。
有什么想法吗?
【问题讨论】:
-
从头算起:c[i] = max{ c[i + 1], c[i + rest(i) + 1] + score(i) }
-
愚蠢的问题,但我可以在递归函数中做到这一点吗?最终的解决方案也是 c[0]?
标签: algorithm recursion dynamic-programming