题目大意:求一个序列的最大连续和
解题思路:
1、sum[i] = max{sum[i-1]+a[i],a[i]}.
解释:
1) 这个式子表示。若当前读取数据>(当前读取数据+之前存储数据之和),则取当前读取数据,否则取(当前读取数据+之前存储数据之和)。这两种取法其实代表的是对序列的两种不同的操作。
2) sum[i-1]+a[i]。把当前读取的数据加入到之前的序列中
3) a[i] 。 新开一个序列。
代码如下:
/*
* 1003_1.cpp
*
* Created on: 2013年8月13日
* Author: Administrator
*/
#include <stdio.h>
/**
*
* 这道题主要涉及到以下几个变量:
* temp
* sum a b
* max A B
*
* 其中
* temp : 当前读取的数据
* sum : 局部最大和
* a : 局部最大和的开始位置
* b : 局部最大和的结束位置
* max : 全局最大和
* A : 全局最大和的开始位置
* B : 全局最大和的结束位置
*
* PS:章泽天,我的女神!!!!
*/
int main(){
int t;
scanf("%d",&t);
int count = 1;
while(t--){
int n;
scanf("%d",&n);
int i;
int temp;
int sum,a,b,max,A,B;
sum = max = -1001;
for( i = 1 ; i <= n ; ++i){
scanf("%d",&temp);
if(sum + temp < temp){
sum = temp ;//新开一个序列
a = b = i;//记录新开序列的位置
}else{
sum += temp;//将当前读取的数据加入到之前存储的数据之中
++b;//原序列的长度加1
}
if(max < sum){
max = sum;
A = a;
B = b;
}
}
printf("Case %d:\n",count++);
printf("%d %d %d\n",max,A,B);
if(t!=0){
printf("\n");
}
}
}