Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
终于过了,好像可以o(n)#include<iostream> using namespace std; int main() { int num; cin>>num; while(num--) { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) scanf("%d",&a[i]); //初始化 int max=a[0]+a[1]; // 通过逐一扫描最后一个选中的元素位置,得解 int temp1=a[0]; //0到i-2内单个最大子段 int temp3=a[0]; // 0到i-2内以i-2为最后选中位置的单个最大子段 int temp2=a[0]+a[1]; //以i为最后选中元素时题目要求的两段最大值 for(int i=2;i<n;i++) { temp2=(temp2>temp1?temp2:temp1)+a[i]; //两种情况。是否包含i-1 if(temp2>max)max=temp2; temp3=(temp3>0?temp3:0)+a[i-1]; //更新 temp1=temp1>temp3?temp1:temp3; //是否包含i-1 } cout<<max<<endl; } return 0; } 进一步请参阅: http://www.52xxyj.cn/52xxyj/blog/?action=show&id=85 http://www.blog.edu.cn/user3/GOLDHUANG/archives/2006/1481691.shtml 及 http://blog.csdn.net/china8848/archive/2008/01/03/2015984.aspx 我也是看了诸前辈的大作,想我的菜鸟才做出来,效率还很低,居然575ms,惭愧,希望大家一起AC改进! Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator