1007 1007 Maximum Subsequence Sum
题目链接:点击进入
大意 :求最大连续子列和
思路:1.分治法
把具体区间分为长度相等的两块,那么答案很显然是以下3种情况:
- 左边的最大序列和
- 右边的最大序列和
- 横跨左右两个区间的最大序列和
具体代码如下:
#include<bits/stdc++.h>
#define maxn 1000000
using namespace std;
int n;int a[maxn];int sx[maxn];
struct maxnum{
int l;int r;int val;
}maxans[maxn];
int cnt;
int find_maxans(int l,int r){
int mid=(l+r)>>1;
if(l==r){
return a[l];
}
int ansl=find_maxans(l,mid);
int ansr=find_maxans(mid+1,r);
int res=0,resl=0,resr=0;
for(int j=mid;j>=l-1;j--)if(sx[mid]-sx[j]>resl)resl=sx[mid]-sx[j];
for(int j=mid+1;j<=r;j++)if(resr<sx[j]-sx[mid])resr=sx[j]-sx[mid];
res=resl+resr;
return max(res,max(ansl,ansr));
}
int main(){
cin>>n;
bool t_flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];if(a[i]>=0)t_flag=1;
sx[i]=a[i]+sx[i-1];
}
if(t_flag==0){
cout<<0<<" "<<a[1]<<" "<<a[n];
return 0;
}
int ans=find_maxans(1,n);
cout<<ans<<" ";
bool flag=0;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(sx[i]-sx[j]==ans){
cout<<a[j+1]<<" "<<a[i];
flag=1;
}
}
if(flag)break;
}
return 0;
}
具体实现的时候发生的问题
- 没有能很好的处理边界条件
- 输出结果的时候运用穷举的方法,并不知道二分搜索可以操作与否。
- 对分治法检索的区间不熟悉导致浪费了很多时间在写记录答案的数组。