动态编程 - 作业选择

时间:2017-02-15 05:07:35

标签: algorithm dynamic

我正在尝试使用动态编程解决作业选择问题。问题如下:   - 每天都有一份工作,每天都有不同的支出   - 你不能连续工作三天(如果你在第1天和第2天工作,你必须在第3天休息一下)   - 制定工作计划,以最大限度地提高您的资金

我已将问题的输入和输出正式化如下:

输入:P [1 ... n] n个正数的列表 输出:m,最大可能支付和A,一组索引{1,... n},使得如果i在A中,并且i + 1在A中,则i + 2不在A中.m是等于集合A中所有值i的P [i]的总和。

我坚持自我缩减的思维过程,以及随后的动态编程算法,以计算最大收益。

非常感谢任何帮助 - 谢谢!

3 个答案:

答案 0 :(得分:0)

一旦你决定在每个点需要考虑多少状态,动态编程就相对简单了,你的解决方案是否有效取决于你选择的状态是否良好。

在这里,我建议每个点的状态是自上次休息后是0天,1天还是2天。因此,对于每一天以及休息后的0,1,2天,我计算最大可能的支付金额,包括那天,假设它是休息后的0,1,2天。

休息后的0天内,最高赔付额是前一天任何州的最高赔付额。那天没有任何贡献,因为你正在休息。

自休息后的1天内,最高付款额是该日的付款加上自当天休息后0天内所有前几天的最高可能付款。

自休息后的2天内,最高支付额是当前和前几天的支出加上两天前的最高支付金额以及自当天最后一次休息以来的0天状态。

因此,您可以使用以前的计算从左到右计算最大支出,总体最大值是与最后一天的任何州相关的最高支出。

答案 1 :(得分:0)

我认为以这种方式形成答案会更容易:

解决方案:

[0,1] ^ n |中的X = [x1,x2,...,xn] xi + xj + zk&lt; = 2,对于每个k = i + 2 = j + 1,i> = 1,k <= n。

最大化:

(x)= [1,N]中i的总和(xi * vi),其中vi是工作日i的支出。

然后递归算法必须决定是否一天工作或者如果不能最大化函数,考虑解决方案的限制。这是DP的一个非常简单的基本模式。

答案 2 :(得分:0)

Mcdowella为这个特殊的DP问题解释了状态和转换的选择。唯一要添加的是图形表示。希望能帮助到你。 Job Selection DP