题目:https://www.luogu.org/problemnew/show/P1115
很简明的一道题;
这里用了递归分治,然而似乎还有更简单的做法(贪心)。
代码如下:
#include<iostream> #include<cstdio> using namespace std; int inf=10005; int n,a[200005]; long long cl(int l,int r) { if(l==r)return a[l]; long long ret1=-inf,ret2=-inf; int mid=((l+r)>>1); long long sum=0; for(int i=mid;i>=l;i--) { sum+=a[i]; ret1=max(ret1,sum); } sum=0; for(int i=mid+1;i<=r;i++) { sum+=a[i]; ret2=max(ret2,sum); } return max(cl(l,mid),max(cl(mid+1,r),ret1+ret2)); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%lld",cl(1,n)); return 0; }
贪心(转):
#include<bits/stdc++.h> using namespace std; int main() { int n[200001],p,ans[200001]={0}; int sum=-9999999;//|x|<=10000 QWQ cin>>p; for(int i=1;i<=p;i++) { cin>>n[i];//输入 ans[i]=max(ans[i-1]+n[i],n[i]);//DP sum=max(sum,ans[i]);//取最大值也同时进行,节约时间 } cout<<sum;//直接输出 return 0; }