您的位置:首页 > 产品设计 > UI/UE

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

2013-10-21 16:38 501 查看
题目链接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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 PAT