P1115最大子段和
阿新 • • 發佈:2018-04-05
cst i++ ref lld 貪心 pri pre () href
題目: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; }
P1115最大子段和