具有动态编程解决方案的TopCoder解决方案

时间:2012-03-02 08:27:51

标签: algorithm

我正在尝试解决这个topcoder问题。我已阅读解决方案分析但仍无法理解。

解决方案的基本思想是向后思考并插入元素而不是删除。 但是,如何降低问题的复杂性呢?

我知道这是一个动态编程问题。我在维基百科上读到DP问题避免重复解决子问题,从而降低复杂性。但我在这里看不到任何子问题的冗余。

由于

问题陈述         星辰(原文如此)是东方宇宙中的一种装置。其目的是快速产生能量。最初它包含连续n个星。星星从左到右标记为0到n-1。给你一个int []重量,其中weight [i]是星i的重量。

以下操作可重复用于产生能量:

Choose a star x other than the very first star and the very last star.
The x-th star disappears.
This generates weight[x-1] * weight[x+1] units of energy.
We decrease n and relabel the stars 0 through n-1 from the left to the right.

您的任务是使用设备生成尽可能多的能量单位。返回可能产生的最大总能量。

1 个答案:

答案 0 :(得分:3)

子问题f(开始,结束)是通过删除[start,end]范围内的所有内部恒星来计算出的最大能量。 (内部恒星是除了端点之外的任何恒星。)

有n个星星,所以这些子问题中只有n * n / 2个。

原始问题是start = 0和end = n-1的子问题的答案。

可以通过考虑要删除的最后一个节点的所有选择来解决子问题。 对于每个选择x,我们添加在x之前删除星的成本f(start,x),以及在x之后删除星的成本f(x,end),以及删除x的成本权重[start] * weight [end]本身。

这需要O(end-start)操作,因此可以在O(n ^ 3)中解决整个问题