这道题很简单。开始时,将cursum和maxsum赋值为nums[0]。 然后将后面的数继续加在cursum上,如果cursum大于maxsum,就把maxsum赋值为cursum, 如果cursum小于零,说明cursum会对后面的子数组产生减小的效果。
还有需要确定最大子数组的起始位置,结束的位置很好确定,开始的位置需要从最大子数组的最后一个往前加,如果加到等于maxsum了,那么这个就是起点了。
源码如下:
-
#include <stdio.h>
-
long long maxSubArray(int *, int);
-
int start, end, i;
-
int main()
-
{
-
int n, t, ct = 1;
-
int nums[100001];
-
scanf("%d", &t);
-
while(t--)
-
{
-
start = 1;
-
end = 1;
-
scanf("%d", &n);
-
for(i = 0; i < n; ++i)
-
scanf("%d", &nums[i]);
-
printf("Case %d:\n", ct++);
-
long long maxsum;
-
printf("%lld ", maxsum = maxSubArray(nums, n));
-
long long sum = 0;
-
for(i = end - 1; i >= 0; --i)
-
{
-
sum += nums[i];
-
if(sum == maxsum) start = i + 1;
-
}
-
printf("%d %d\n", start, end);
-
if(0 != t) printf("\n");
-
}
-
return 0;
-
}
-
-
long long maxSubArray(int * nums, int n)
-
{
-
long long cursum = nums[0];
-
long long maxsum = nums[0];
-
for(i = 1; i < n; ++i)
-
{
-
if(cursum < 0)
-
{
-
cursum = 0;
-
start = i + 1;
-
}
-
cursum += nums[i];
-
if(cursum > maxsum)
-
{
-
maxsum = cursum;
-
end = i + 1;
-
}
-
}
-
return maxsum;
-
}
阅读(554) | 评论(0) | 转发(0) |