两个最大的连续子阵列
Two largest contiguous subarray
我当前正在做一个类似于最大连续子阵列问题的问题。但是,我最多可以找到两个不重叠的连续子阵列,而不是只找到一个连续的子阵列。
例如,对于下面的测试案例,答案是20
5 3 -20 4 8
为此,我实施了以下代码:
long long n, nums[500500], dp[500500][2][3];
long long best(int numsLeft, int beenTaking, int arrLeft) {
if (arrLeft < 0 || numsLeft < 0) return 0;
if (dp[numsLeft][beenTaking][arrLeft] != -1)
return dp[numsLeft][beenTaking][arrLeft];
if (beenTaking) {
// continue Taking
long long c1 = best(numsLeft - 1, beenTaking, arrLeft) + nums[numsLeft];
// stop Taking
long long c2 = best(numsLeft - 1, 0, arrLeft);
return dp[numsLeft][beenTaking][arrLeft] = max(c1, c2);
} else {
// continue not Taking
long long c1 = best(numsLeft - 1, beenTaking, arrLeft);
// start Taking
long long c2 = best(numsLeft - 1, 1, arrLeft - 1) + nums[numsLeft];
return dp[numsLeft][beenTaking][arrLeft] = max(c1,c2);
}
}
这是函数调用:
cout << best(n - 1, 0, 2) << endl;
在函数调用之前,DP数组已填充为-1。NUMS数组包含n个元素,零索引。
ideOne.com链接是:http://ideone.com/p5pb7h
虽然我的代码确实适用于上面显示的样本测试案例,但对于其他一些测试案例(我不可用),它会失败。我的代码没有任何边缘案例?我要去哪里?谢谢您的帮助。
我尝试提出一些这样的边缘案例,但无法做到。
问题似乎在以下几行中:
if (beenTaking) {
// continue Taking
long long c1 = best(numsLeft - 1, beenTaking, arrLeft) + nums[numsLeft];
...
} else {
...
}
添加 best(numsLeft - 1, 1, arrLeft)
而不减少rharfft意味着nums[]
中第一个numsLeft - 1
值的"最佳"结果发生在nums [] [] [] [index numsLeft - 1
)的结尾。这可能不是真的。
因此,当有2个以上的正范围被负值分开时,代码可能会失败。
另外,dp
数组应初始化为明显超出范围的东西,例如llong_min,而不是-1,这可能是合法的总和。
相关文章:
- OpenMP阵列性能较差
- 模板元程序查找相似的连续类型名称
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- EASTL矢量<向量<int>>连续的
- 位阵列上的快速AND运算
- 分配/访问2d阵列,使得2d子块是连续的
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器
- 将阵列分成更小的连续部分,以使 NEO 值最大化
- 递归长度的最大上升连续子阵列(C )
- 两个最大的连续子阵列
- 快速将双重指针阵列转换为单个指针,可能是连续的
- 给定2D阵列的连续子阵列中的最大总和
- 阵列中连续元素的总和C
- 阵列 - 动态编程中的连续最大总和
- 连续分配多维阵列
- 用于搜索位阵列以查找连续设置/清除位的快速代码
- 所有连续子阵列优化的总和
- 大型3D阵列的性能:连续1D存储与T***
- 动态2d阵列非连续存储器c++