Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 最大化数组间隔之和_Arrays_Algorithm_Data Structures_Dynamic Programming - Fatal编程技术网

Arrays 最大化数组间隔之和

Arrays 最大化数组间隔之和,arrays,algorithm,data-structures,dynamic-programming,Arrays,Algorithm,Data Structures,Dynamic Programming,给定一个大小为N的二维数组,我想最大化array[0][k1]+array[k1+1][k2]+array[k2+1][k3]+…+给定x的数组[kx+1][N-1]。所有k值都在严格增加 对于较小的x值(x=2,3,4),动态规划解决方案似乎是可行的 然而,边界是1假设我们处于一个特定的状态(ki,xi),其中ki是当前的k索引,x是最后一个k为了给出问题的答案,我们需要尝试从这个状态中找到我们可以创建的最大值 我们观察到问题可以分为子问题(ki,xi)。对于每个(ki,xi)状态,结果与之前

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

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


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

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

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

  • 否则,
    (ki,xi)=带有z>xi的数组[xi][z]+max(ki+1,z)

下面是一个简单的伪代码

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;

}
int[]dp;
布尔[][]检查;
布尔最大值(整数k,整数x){
如果(k==X){
返回true;
}
如果访问此状态{
退票[k][x];
} 
布尔结果=假;
对于(int i=x+1;i

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

什么是
x
,内部N个数组的大小是多少?1可能是
x
kx
中是多少表示
k
?你能详细描述一下你的
dp
方法吗?我认为使用
dp[x][n][n]
应该有效吗?n=100的O(n^4)也不错。对不起,我不清楚。Pham Trung是正确的,x是k的不同数。我也错了。还有,obgnaw,1 dp[x][n][n]如何工作?我的印象是,你需要dp[n][n][n][n]…[n][n]来获得大约100英镑。我相信dp[x][n][n]就足够了。我不太确定我是否完全理解。为了找到x=2, 3,甚至100的解,我只需改变int [][][DP ]的大小,然后设置k= x,正确,@ j1119 yUP,关键概念是对于状态<代码>(Ki,席,Yi)< /C> >的最大值独立于先前状态,因此,我们可以使用它作为我们的dp状态。当我们找不到足够的k时,有什么特殊情况?@j1119我不知道,如果它不可接受,是否需要返回无效,或者如果可以用小于
x
k的值来形成答案,则只需返回您所拥有的内容,这取决于您的具体问题。感谢您的帮助,我需要关键的观察!