【问题标题】:SPOJ : Weighted SumSPOJ:加权和
【发布时间】:2013-08-15 19:10:05
【问题描述】:

给你 N 个整数,A[1] 到 A[N]。您必须为这些整数分配权重,以便它们的weighted sum is maximized。权重应满足以下条件:

  1. 每个权重都应该是一个正整数。
  2. W[1] = 1
  3. 对于 i > 1,W[i] 应该在 [2, W[i-1] + 1] 范围内

加权和定义为 S = A[1] * W[1] + A[2] * W[2] + ... + A[N] * W[N]

例如:

n=4 , array[]={ 1 2 3 -4 } , answer = 6 when we assign { 1 2 3 2 } respective weights .

所以,据我的理解和研究,没有贪婪的解决方案是可能的。我在 pen n paper 上设计了许多测试用例,但无法得到一个贪婪的策略。

任何想法/提示/接近人们。

【问题讨论】:

    标签: algorithm dynamic-programming greedy


    【解决方案1】:

    通过将权重j 分配给A[i],让dp[i][j] 等于我们可以从A[1..i] 得出的最大加权和。显然dp[i][j] = j*A[i] + max(dp[i - 1][(j - 1)..N])。有O(N^2) 状态,我们的循环对每个状态都采用O(N),因此总体时间复杂度将为O(N^3)。为了将其减少到O(N^2),我们可以注意到我们的重复出现明显的重叠。

    如果dp[i][j] = j * A[i] + max(dp[i - 1][(j - 1)..N]),那么

    dp[i][j - 1] = (j - 1)*A[i] + max(dp[i - 1][(j - 2)..N]) = (j - 1)*A[i] + max(dp[i - 1][j - 2], dp[i - 1][(j - 1)..N]) = (j - 1)*A[i] + max(dp[i - 1][j - 2], dp[i][j] - j*A[i])
    

    这意味着重复只需要 O(1) 来计算,给你 O(N^2) 的时间。

    【讨论】:

    • 最后一个等式一定有错别字,你不应该在最后有类似 dp[i,j] - j*A[i] 而不是 dp[i,j] 的东西吗?
    • 是的,很抱歉我必须快速输入这个错误
    • 鉴于我在最佳解决方案的答案中指出的结构,我认为有可能获得 O(N) 但我认为您的答案是正确的,并且至少可以冷静下来O(N^2)
    【解决方案2】:

    可以使用相当标准的动态规划方法在 O(N³) 时间内解决此问题。令 V(k,u) 表示当 Wₖ₋₁ 具有值 u 时使用元素 k...N 可以获得的最佳值。观察到V(k,u)是g·Aₖ+V(k-1,g)的最大值,因为g的范围是2到u+1,V(N,u)是(u+1)· AN 如果 AN 为正数,否则为 2·AN

    请注意,在任何 V(k,u) 计算中 u 最多为 k,因此 (k,u) 有 N*(N-1)/2 个可能的值,因此概述的方法使用 O(N² ) 空间和 O(N³) 时间。

    【讨论】:

    • O(n^3) 效率太低了.. 对 N
    • @Spandan:jwpat7 为您提供了一个解决方案,可以解决您的问题。您从来没有说过“只有 O(N^2) 的解决方案是可以接受的”之类的话,那么为什么要投反对票呢?
    【解决方案3】:

    这里有一些见解,可能会让您或其他人想出一个非常快速的解决方案。请注意,对于最佳解决方案,您可以放心地假设在每一步中,您将权重从前一个权重增加 +1,或者将权重一直降低到最小值 2。要看到这一点,假设您有违反性质的最优解。然后你在某个位置i-1 有一些权重> 2,下一个权重在i 位置也> 2,但没有增加。现在考虑从位置i 开始的最优解中权重的最大长度弱增加子序列(弱增加意味着在子序列中的每一步,权重都不会减少)。通过假设,这个子序列的最优解并不比相同的解差,除了子序列的所有权重都减去 1。但这意味着将子序列中的所有权重增加 1 也不会使最优解变得更糟。因此,为了获得最佳解决方案,您可以在每一步安全地假设您将权重增加 1 或将权重设置为最小值 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2016-03-10
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多