最大子段和
来源:互联网 发布:充话费软件怎么赚钱 编辑:程序博客网 时间: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
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- “最大子段和”
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- Unsupported major.minor version 51.0
- 层次选择器中的注意事项
- Makefile学习笔记<中一些特殊符号的含义和用法>
- LightOJ1027-A Dangerous Maze
- nginx解决跨域问题
- 最大子段和
- 类型信息
- 用android studio写个ping的程序(三)
- Java enum的用法详解
- PAT1047 编程团体赛
- Oracle数据库中ROWNUM的详解与应用
- Spring读取配置文件的方法
- 网络学习笔记(网络字节序)
- struts2的action并发文件上传