问题描述:求一个数组的最大连续子数组和,并输出子数组的第一个和最后一个元素。
解题思路:动态遍历数组,当和小于0时,则重新开始,
定位最后一个数好办,前一个数则可以:1)从后往前找,2)直接在动态遍历时更新有问题,虽然通过了,为了节省空间而增加代码,也不一定可取。
AC代码:
/*1007 Maximum Subsequence Sum(25 分)
*要求:求一个数组的最大子数组和,并输出子数组的第一个和最后一个元素。
*方法:动态遍历数组,当和小于0时,则重新开始,
*定位最后一个数好办,前一个数则可以1》从后往前找,2》直接在动态遍历时更新有问题,虽然通过了,为了节省空间而增加代码,也不一定可取。
*/
#include<iostream>
using namespace std;
int main()
{
int K,Maxsum=-1,sum=0;//有可能最大值为0
//freopen("test.txt","r",stdin);
scanf("%d",&K);
int first=-1,nfirst,end=0; //=-1,可以删除最开始为0的子数组。比如-1 0 1 2 3 -3结果为6 0 3当测试点好像没检测这个
int num,a;
scanf("%d",&a); //保存第一个数,预防全为复数
--K;
if(a>=0){ //当a<0时,相当于舍去第一个点。
Maxsum=a;sum=a;first=a;end=a;nfirst=a;
}
while(K){
scanf("%d",&num);
sum+=num;
if(first<0)first=num;//刷新第一个数
if(sum<0){
sum=0;first=-1;
}else{
if(Maxsum<sum){
Maxsum=sum;end=num;nfirst=first; //刷新输出
}
}
--K;
}
if(Maxsum<0)printf("%d %d %d",0,a,num);
else printf("%d %d %d",Maxsum,nfirst,end);
return 0;
}