题目链接:https://www.patest.cn/contests/pat-a-practise/1007
题目大意:求一个数列的最大子列和,并输出该子列的起点和终点元素
解题思路:
最大和maxsum和临时和curSum初始化为0。临时和变大时更新maxsum,临时和小于0的时候,将其更新为0。end的更新比较好理解,end在cursum>maxsum的条件下随着i一直递增start的更新稍微复杂一点,start位置的前一个cursum<0,并且start处cursum>maxsum。不要忘记处理边界情况:全为负数的时候。代码如下:
#include <iostream> using namespace std; int main(int argc, char const *argv[]) { int maxSum=-1,curSum=0,start=0,tmpstart=0,end=-1,n; cin>>n; int A[n]; for(int i=0;i<n;i++) cin>>A[i]; for(int i=0;i<n;i++){ curSum+=A[i]; if(curSum>maxSum){//临时最大值变大 maxSum=curSum;//更新最大值 end=i;//更新结尾下标 start=tmpstart;//更新开始下标 } if(curSum<0){//临时和为负 curSum=0;//将其置0 tmpstart=i+1;//开始下标前移 } } if(end==-1)//全都为负数 cout<<"0 "<<A[0]<<" "<<A[n-1]<<endl; else cout<<maxSum<<" "<<A[start]<<" "<<A[end]<<endl; return 0; }