使用动态编程的Painter分区

时间:2017-11-06 09:59:24

标签: recursion dynamic-programming recurrence

问题陈述:

你必须画出长度为{A0,A1,A2 ...... AN-1}的N块板。有K画家,你也可以给画家画一个单位的时间。你必须尽快完成这项工作,任何画家只会画出连续的板块,比如板{2,3,4}或只有板{1}或者只有板{2,4, 5}。

如何使用动态编程来解决这个问题。这个问题的一个近似是画家“我”只绘制了由画家“j”绘制的板子,如果我小于j。这可以使用DP轻松解决,但如何使用DP来解决原始问题?

谢谢..

1 个答案:

答案 0 :(得分:1)

我自己碰到了这个问题,我认为它真的很整洁。

DP解决方案是考虑一个网格,其中一个自由度是画家的人数(从1-> k),另一个是板子列表的索引(因此遍历这种自由度时,您就是每次再增加一个木板。

要观察的第一件事是,如果您有一个画家,那么涂到木板A [i]上所花费的时间就是这些木板到该点为止的大小之和。相反,如果您只有第一个木板,并且不断增加画家,那么所花的时间只是该木板的大小,更多画家无济于事。

现在的诀窍是考虑如何使用此信息来计算2个画家和2个木板的最佳时间。让我们显式地绘制表格的第一部分

     | k = 1 | k = 2 | k = 3 |
------------------------------
| b1 |  S_00 |  S_00 |  S_00 |
| b2 |  S_01 |       |       |
| b3 |  S_02 |       |       |

列索引是'k'画家数,行索引是您要包含的板数(按顺序)。 S_ij是一位画家将板i涂成j的成本之和(所以S_00 = A [0])

因此对于2个画家和2个板,一个画家的油漆都为S_01,每个画家的油漆都为max(A [0],A [1]),因为时间将取决于哪个更大的板。

所以我们最多只能用2个画家和2个板做这两个中的最少一个,因此表中的新条目将是

min(S_01, max(A[0],A[1])

然后您可以根据相同的逻辑继续填写表格。

但是,真正酷的是,您可以使用对数搜索在对数时间内进行此操作!我在这里还假设所有画家都以相同的速度绘画,否则会更加困难。