【问题标题】:Minimum cost to make all array elements zero使所有数组元素为零的最低成本
【发布时间】:2021-08-13 17:21:08
【问题描述】:

使所有数组元素为零的最小成本因此操作如下:

数组 A 的子数组是数组 A 中的一个 od 连续元素。给定一个包含 N 个元素的数组 A,您可以根据需要多次应用以下操作:

操作 1:选择任何子数组 [L,R] 并递减该子数组中的每个元素以获得成本 C1 操作 2:选择索引 I 使得 A[i] 为正并设置 A[i] = 0。此操作的成本为 C2

我们的任务是找到使所有元素为零的最低成本。

1 <= C1 <= 10 
1 <= C2 <= 10^4
1 <= A[i] <= 10^8

【问题讨论】:

  • 你最好制定一个一致的问题帖子,而不是在最小操作数和最小成本之间变化。
  • @sri 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后查看help center,看看你可以问什么问题。请看:How do I ask and answer homework questions?
  • @sri - 应该明确是否允许 A[i] 减少到零以下。
  • @Armali 可以,但这样做没有意义,因为如果有A[i] &lt; 0,它就不能再是0了。
  • 啊,你是对的 - 我误读了 这样 A[i] 是肯定的,因为它应该是 这样认为 i 是肯定的

标签: dynamic-programming


【解决方案1】:

我将在这里描述一个分而治之的算法。

想法

请注意,当我们有一个数组时,在任何操作 2 之前执行所有操作 1 总是最佳的。为什么?当您执行操作 2 时,例如在数组 [1, 1, 3, 4] 上,假设您将第三个元素设置为 0,它将使数组 [1, 1, 0, 4]。以前在数组[1, 1, 3, 4] 中,我们可以在间隔[0, 3] 上执行操作1,但现在我们需要两个操作来完成相同的操作(即[0, 1][3, 3])。因此,在任何操作 2 之前执行所有操作 1 始终是最佳的。

此外,我们注意到,当我们执行操作 1 时,我们总是这样做,以便某些元素会到达 0,否则执行操作 1 将毫无意义。这产生了一个分而治之的算法,我将举例说明:

实施

假设数组是[8, 4, 3, 6, 7, 9, 12, 5]。我们调用一个递归函数solve(0, 7),它将返回使所有元素为0的成本。

solve(0, 7),我们有两个选择:

  1. [0, 7] 上应用操作1 3 次,它会将数组减少到[5, 1, 0, 3, 4, 6, 9, 2],成本为3 * C1。然后递归求解solve(0, 1)solve(3, 7)。答案是3 * C1 + solve(0, 1) + solve(3, 7)
  2. 对所有元素应用操作 2。这将产生(7 - 0 + 1) * C2 = 8 * C2 的成本。

我们采取任何一种方式来降低成本。

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多