Arrays 最大化数组间隔之和
给定一个大小为N的二维数组,我想最大化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)状态,结果与之前
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的值来形成答案,则只需返回您所拥有的内容,这取决于您的具体问题。感谢您的帮助,我需要关键的观察!