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 |
DP附代码。。从两端分别求以i为尾的最大连续子段和。然后把两端子段和相加求其最大值。。 #include<iostream> using namespace std; int a[50010]; int b[50010]; int c[50010]; int main(){ int n,t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1; i<=n; ++i){ scanf("%d",a+i); } for(int i=1; i<=n; ++i){ if(i==1){ b[i]=a[i]; } else{ if(b[i-1]>0){ b[i] = a[i]+b[i-1]; } else{ b[i]=a[i]; } } } for(int i=2;i<=n; ++i){ if(b[i]<b[i-1])b[i]=b[i-1]; } for(int i=n; i>=1; --i){ if(i==n)c[i]=a[i]; else{ if(c[i+1]>0){ c[i]=c[i+1]+a[i]; } else{ c[i]=a[i]; } } } for(int i=n-1; i>=1; --i){ if(c[i]<c[i+1])c[i]=c[i+1]; } int max=b[1]+c[2]; for(int i=2; i+1<=n; ++i){ if(max<b[i]+c[i+1])max=b[i]+c[i+1]; } printf("%d\n",max); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator