两个最大的连续子阵列

Two largest contiguous subarray

本文关键字:连续 阵列 两个      更新时间:2023-10-16

我当前正在做一个类似于最大连续子阵列问题的问题。但是,我最多可以找到两个不重叠的连续子阵列,而不是只找到一个连续的子阵列。

例如,对于下面的测试案例,答案是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,这可能是合法的总和。