C++ PAT甲级 最大连续子序列和

原题链接https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805514284679168
题目大意: 有一个数字序列 a1,..., an, 求i, j (1 <= i <= j <= n), 使得ai + ... + aj最大,输出最大和和ai, aj。 若所有的数均小于0, 则认为最大和为0,输出首尾元素。若有多种方案,输出i, j最小的一组。

问题

    if (flag == false) 
    {
        printf("0 %lld %lld\n",arr[0],arr[k - 1]);
        return 0;
    }

为什么删去其中的return 0; 有的用例就不能通过呢?

以下是完整代码:

#include
const int MAX = 10001;
typedef long long LL;
LL arr[MAX], dp[MAX], indexArr[MAX] = {0};

int main()
{
    LL k;
    bool flag = false;
    scanf("%lld", &k);
    for (int i = 0; i < k; i++)
    {
        scanf("%lld", &arr[i]);
        if (arr[i] >= 0) flag = true;
    }
    
    if (flag == false) 
    {
        printf("0 %lld %lld\n",arr[0],arr[k - 1]);
        return 0;
    }
    
    dp[0] = arr[0];
    for (LL i = 1; i < k; i++)
    {
        LL sum = dp[i - 1] + arr[i];
        if (sum > arr[i])
        {
            dp[i] = sum;
            indexArr[i] = indexArr[i - 1];
        }
        else
        {
            dp[i] = arr[i];
            indexArr[i] = i;
        }
    }
    
    LL indexNum = 0;
    for (LL i = 1; i < k; i++)
    {
        if (dp[i] > dp[indexNum])
        {
            indexNum = i;
        }
    }
    
    printf("%lld %lld %lld\n", dp[indexNum], arr[indexArr[indexNum]], arr[indexNum]);
    
    return 0;
}

img

参考:https://blog.csdn.net/qq_37370420/article/details/84145777