PAT(Advance Level) 1007 Maximum Subsequence Sum 解题报告

来源:互联网 发布:网络与系统安全 编辑:程序博客网 时间:2024/05/18 01:17

题目链接http://pat.zju.edu.cn/contests/pat-a-practise/1007

本题是经典的最大子连续序列问题,可以使用分治法求解。

但是本题还有一种很有技巧性的算法,虽然正确性不如分治法,但是时间复杂度较小(仅为O(n))。

注意一个case:-1 0 -2,容易被忽视,正确的输出应该是0 0 0,而不是0 -1 -2。

下面是C++实现代码:

#include<iostream>using namespace std;int num[10010];struct subseq{int maxsum;int start_pos;int end_pos;subseq(int sum=-1,int s=0,int e=0):maxsum(sum),start_pos(s),end_pos(e){}} ans;int main(){int k;cin>>k;ans.end_pos=k-1; //初始化int thissum=0;int tag=0;       //标记位,表示工作子序列的起点是否发生了变化int temp_start;  //暂存工作子序列起点for(int i=0;i<k;i++){cin>>num[i];thissum+=num[i];if(thissum>ans.maxsum){ans.maxsum=thissum;ans.end_pos=i;if(tag==1) //表示子序列的起点发生变化了{ans.start_pos =temp_start;tag=0;}}else if(thissum<0){thissum=0;tag=1;temp_start=i+1;}}if(ans.maxsum==-1)  //表示输入的数字全为负数ans.maxsum=0;cout<<ans.maxsum<<" "<<num[ans.start_pos]<<" "<<num[ans.end_pos]<<endl;//system("pause");return 0;}


 

原创粉丝点击