题意解释:
给定n个数,求两段连续不重叠子段的最大和。比如1 -1 2 2 3 -3 4 -4 5 -5结果就是 {2,2,3,-3,4} 和{5},也就是两者的和13。
选题原因:
解题思路:
先对数字串从左向右依次求出每段的连续子序列的最大字段和,并将其存入数组array[i]中(i为对应位置),再从右向左用同样的方法求一次最大字段和,并将每个子段i~n的和与对应的另一半1~i-1相加,求出最大值。也就是对每个位置i来说,求出[1~i-1]的最大子段和以及[i~n]的最大子段和,再相加起来,求最大的一个就行了。
与基础的求最大字段和不同的是,该题需要对每个子段记录其最大和,即存入数组array[i]中。
代码如下: #include <stdio.h>
int array[50001], num[50001];
const int MIN = -999999999;
int main()
{
int tcase, n;
scanf("%d", &tcase);
int tmp, ans, i, sum;
while(tcase--)
{
scanf("%d", &n);
tmp = MIN; sum = 0;
for(i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
sum += num[i];
if(sum > tmp)
tmp = sum;
array[i] = tmp; // 记录每个字段的最大值。
if(sum < 0)
sum = 0;
}
tmp = ans = MIN;
sum = 0;
for(i = n; i > 1; i--)
{
sum += num[i];
if(sum > tmp)
tmp = sum;
if(ans < (array[i-1] + tmp))
ans = array[i-1] + tmp;
if(sum < 0)
sum = 0;
}
printf("%d\n", ans);
}
return 0;
}
又是学来的一道题,脑瓜疼,学别人的还不太会