算法动态规划

时间:2017-07-13 05:32:49

标签: algorithm dynamic-programming

您将获得一个由数字组成的数组(数组大小为10 ^ 5),您需要将数组划分为K分区(k <= 500),以使每个分区的最小元素之和最大

说数组包含a1,a2,a3 ....... an 现在f(x)= min(a1,a2..ax)+ min(a(x + 1),a(x + 2)... ay)+ .......... a(z 1)...... A(N)

现在f(x)应该是最大值

其中partition必须是连续的。
所需的复杂性。 (n * k)

我只是逐个修复了最大元素并尝试查看,如果它可以分为K分区,如果是,我计算了f(x)

1 个答案:

答案 0 :(得分:0)

当分区数为dp[i] = f(x)时,请i 其中f(x)由OP定义 让我们现在开始解决它 - 基本情况 -

dp[n]=sum(array elements);
//ie when number of partitions is n we return sum of elements as each element is in different partition

现在,

dp[i-1] = dp[i] - min of partition collapsed in this step

所以,现在我们只需找到每一步都需要折叠的分区。这可以通过蛮力一次取两个相邻的分区并保持哪个分区的崩溃最不利(可以在O(n)中完成)来完成。

因此,总时间复杂度为O(n * n-k),空间复杂度为O(n)。嗯,这是技能的限制,任何可以帮助改善的人都是受欢迎的。