题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
题目大意:给出一个长度为n的序列,求这个序列的最大子序列和,并输出子序列的起止位置。
题目思路:两个变量,max和sum,max用来记录当前的最大子序列和,sum记录当前子序列和,每输入一个数,就把这个数加到sum中去,当sum>max的时候,更新max的值和起止位置,当加到sum<0的时候,以下一个数为起点,重新计算子序列和,最后max的值就是最大子序列的和。
AC代码:
// HDOJ
// 1003.cpp
/*
ID: Firwaless
LANG: C++
TASK: Max Sum
*/
#include <cstdio>
#include <cstring>
int main()
{
int a, i, j, T, n, s, t, tmps, max, sum;
while (~scanf("%d", &T))
{
for (j = 1; j <= T; j++)
{
sum = 0; // 初始化序列的和为0
tmps = 1; // 初始化最大子序列和的起点为1
max = -0x80000000; // 初始化最大子序列和为无穷小
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &a);
sum += a;
/* 如果子序列和大于当前最大子序列和,更新起止位置和最大子序列和 */
if (sum > max)
{
t = i;
s = tmps;
max = sum;
}
/* 如果子序列和小于0,舍弃前段子序列,重新计算 */
if (sum < 0)
{
sum = 0;
tmps = i + 1;
}
}
if (j != 1)
{
printf("\n");
}
printf("Case %d:\n%d %d %d\n", j, max, s, t);
}
}
return 0;
}