原题链接: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<cstdio>
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;
}