首先自己去做的时候,思考的过于复杂,一些想法不敢用上,实际上我们就是要充分运用计算机的特性,做一些人做起来慢的事情。
Steps 1: 用循环的方式,前1到n项和都可以累计出来.
Steps 2: 使用条件语句来找出最大值,同时可以找出起始和结束位置。
求子序列的最大值和起始位置和结束位置
http://acm.hdu.edu.cn/showproblem.php?pid=1003
#include<stdio.h>
#include<string.h>
int main()
{
int T, N;
int t, i;
int a[100001];
scanf("%d", &T);
for(t = 0; t < T; t++)
{
scanf("%d", &N);
for(i = 0; i < N; i++)
scanf("%d",&a[i]);
int maxSum = a[0];
int sum = 0, l=0, r=0;
int tmpL = 0;
for(i = 0; i < N; i++)
{
sum += a[i];
if(sum > maxSum)
{
maxSum = sum;//巧妙的记录了循环过程中出现的最大值。
l = tmpL;
r = i;
}
if(sum < 0)//a:若序列为负时,只需找出哪一项相对最大即可,将sum重置为0则可以巧妙的找出最大项了,同时便可以把初始和结束位置一起找出来。
b:先正后变负,正时tmpl不产生变化,r为右边界,sum变负时,tmpl变成i+1,接着sum重置,
{
sum = 0;
tmpL = i+1;
}
}
printf("Case %d:\n", t+1);
printf("%d %d %d\n", maxSum, l+1, r+1);
if(t < T-1)
printf("\n");
}
return 0}