最大子段和

来源:互联网 发布:充话费软件怎么赚钱 编辑:程序博客网 时间:2024/05/22 03:09

HDU:1266 最大子段和

方法一:

#include<bits/stdc++.h>using namespace std;int max(int x,int y){if(x>=y)return x;elsereturn y;}int main(){int t;cin>>t;while(t--){int n,ma,i,a[100005],b[100005];cin>>n;for(i=0;i<n;i++){cin>>a[i];}if(n==1)//n==1和n==2单独考虑 cout<<a[0]<<endl;else if(n==2){ma=max(a[0],a[1]);cout<<ma<<endl;}else//b数组存的为第i项前的最大子段和 {b[0]=a[0];//b[0],b[1]单独写出来 b[1]=a[1];ma=a[0];//ma一直更新,为最大值 for(i=2;i<n;i++){b[i]=max(a[i],b[i-2]+a[i-1]+a[i]);ma=max(b[i],ma);}}printf("%d\n",ma);}}

方法二:

#include<bits/stdc++.h>using namespace std;int max(int x,int y){if(x>=y)return x;elsereturn y;}int main(){int t;cin>>t;while(t--){int n,ma,i,max1,max2,sum,l,a[100005];cin>>n;for(l=1,i=0;i<n;i++){cin>>a[i];if(a[i]>0)l=0; }ma=a[0];if(l)//如果a[i]全<0,特殊情况,直接输出最大值 {for(i=0;i<n;i++)ma=max(ma,a[i]);cout<<ma<<endl;}else{max1=a[0]; max2=a[1];sum=a[0];for(i=0;i+2<n;i+=2)//两个两个加,第一个从第一位数开始 {//注意i+2<n,防止越界 sum=sum+a[i+1];if(sum<0)//sum是第i+2项前的最大和 sum=0;sum=sum+a[i+2];if(max1<sum) max1=sum;}sum=a[1];for(i=1;i+2<n;i+=2)//两个两个加,第2个从第2位数开始 {sum=sum+a[i+1];if(sum<0)sum=0;sum=sum+a[i+2];if(max2<sum) max2=sum;}ma=max(max1,max2);cout<<ma<<endl; }}}


 

0 0