我目前正在做一个类似于最大连续子阵列问题的问题。但是,我可以找到最多两个不重叠的连续子阵列,而不是只找到一个连续的子阵列。
例如,对于下面的测试用例,答案是 20,因为我们可以取除 -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
虽然我的代码确实适用于上面显示的示例测试用例,但它对于其他一些测试用例(我不可用)却失败了。是否有任何边缘情况没有被我的代码捕获?我哪里错了?感谢您的帮助。
我尝试提出一些这样的边缘案例,但我无法这样做。