【问题标题】:Maximize sum of array intervals最大化数组间隔的总和
【发布时间】:2018-02-26 01:29:38
【问题描述】:

给定一个大小为 N 的二维数组,我想为给定的 x 最大化 array[0][k1] + array[k1 + 1][k2] + array[k2 + 1][k3] + ... + array[kx + 1][N - 1]。所有k 值都在严格增加。

对于较小的 x (x = 2, 3, 4) 值,动态规划解决方案似乎是可行的。

但是,界限是 1

【问题讨论】:

  • 什么是x,内部N个数组的大小是多少?
  • 1是什么a[0][k1] + a[1][N-1]
  • 也许xkx 中表示k 的数量?您能详细介绍一下您的dp 方法吗?我认为使用dp[x][n][n] 应该可以吗? O(n^4) 且 n = 100 还不错。
  • 对不起,我不清楚。 Pham Trung 是正确的,x 是 k 的不同数。我也错了。此外, obgnaw, 1
  • dp[x][n][n] 如何工作?我的印象是你需要 dp[n][n][n][n]...[n][n] 来获得类似 100 的值。 dp[x][n][n] 就足够了,我相信。

标签: arrays algorithm data-structures dynamic-programming


【解决方案1】:

假设我们处于特定状态(ki, xi),其中ki是当前k索引,x是最后一个k为了给出问题的答案,我们需要尝试找到我们可以从这个状态创造的最大值。

我们观察到问题可以分为子问题(ki, xi)。对于每一个(ki, xi)的状态,结果与之前的状态无关,我们可以有我们的公式:

  • 对于 ki == x,答案 = 0

  • 否则,(ki, xi) = array[xi][z] + max(ki + 1, z) with z > xi

这是一个简单的伪代码

int[][]dp;
boolean[][]check;
boolean maxAmount(int k, int x){
    if(k == X){
       return true;
    }
    if this state is visited {
       return check[k][x];
    } 
    boolean result = false;

    for(int i = x + 1; i < n; i++){
        if(maxAmount(k + 1, i)){
            result = true;
            dp[k][x] = max(dp[k][x], array[x][i] + dp[k + 1][i]);
        }
    }
    return check[k][x] = result;

}

注意:对于我们找不到足够的k的特殊情况,你需要根据需要进行处理,但应该是微不足道的。

【讨论】:

  • 我不太确定我是否完全理解。为了找到 x=2、3 甚至 100 的解,我只需改变 int[][][] dp 的大小,然后设置 k = x,对吗?
  • @j1119 是的,关键思想是状态 (ki, xi, yi) 的最大值与之前的状态无关,因此我们可以将其用作我们的 dp 状态
  • 找不到足够k的特殊情况是什么?
  • @j1119 我不知道,如果不可接受,您是否需要返回无效,或者如果可以形成小于x k 的答案,则只返回您拥有的任何东西,这取决于您的具体问题。
  • 感谢您的帮助,我需要关键观察!
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多