牛客在线编程_连续子数组最大和
求最大子段和
- 可以用贪心,dp和分治。
- dp的做法其实和贪心一模一样…也不知道是不是dp。
code1(贪心)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int n,a[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int ans=-0x3f3f3f3f;
int p=0;
for(int i=1;i<=n;i++){
p+=a[i];
ans=max(ans,p);
if(p<0){
p=0;
}
}
printf("%d\n",ans);
return 0;
}
code2(分治)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int n,a[N];
int sum(int l,int r){
if(l==r){
return a[l];
}
int mid=(l+r)/2;
int lsum=sum(l,mid);
int rsum=sum(mid+1,r);
int ls=0;
int rs=0;
int tmp=0;
for(int i=mid;i>=l;i--){
tmp+=a[i];
ls=max(ls,tmp);
}
tmp=0;
for(int i=mid+1;i<=r;i++){
tmp+=a[i];
rs=max(rs,tmp);
}
int msum=ls+rs;
return max(msum,max(lsum,rsum));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
printf("%d\n",sum(1,n));
return 0;
}
code3(动态规划)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int n,a[N],dp[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dp[1]=a[1];
int ans=dp[1];
for(int i=2;i<=n;i++){
if(dp[i-1]>0){
dp[i]=dp[i-1]+a[i];
}else{
dp[i]=a[i];
}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}
版权声明:本文为zxcoder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。