本蒟蒻太菜了,还不太能理解为什么,先存一下题解,有时间再来研究。
分治法
O ( n log n ) O(n\log n) O(nlogn)
#include<bits/stdc++.h>using namespace std;
using ll=long long;
int n;
vector<int>v;
int Find(int l,int r){//处理横跨左右两个区间int m=l+r>>1;//在中间分别向两侧扫描int suml=0,ansl=v[m];//suml:临时变量,ansl:左区间最大和int sumr=0,ansr=v[m+1];//sumr:临时变量,ansr:右区间最大和for(int i=m;i>=l;i--){suml+=v[i];ansl=max(ansl,suml);}for(int i=m+1;i<=r;i++){sumr+=v[i];ansr=max(sumr,ansr);}return ansl+ansr;//加和即为整段区间最大和
}
int Max(int l,int r){if(l==r) return v[l];int m=l+r>>1;//分治法,将区间不断细分,直到把所有数拆成横跨区间情形int ml=Max(l,m);int mr=Max(m+1,r);int lr=Find(l,r);//处理横跨左右两个区间int ans=max({ml,mr,lr});return ans;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;v.resize(n);for(auto &i:v) cin>>i;cout<<Max(0,n-1)<<endl;return 0;
}
DP
O ( n ) O(n) O(n)