1305:Maximum sum
和 股票买卖 差不多。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=50005; 7 int a[N],b[N][2],c[N][2]; 8 9 int main(){ 10 int t,n; 11 cin>>t; 12 while(t--){ 13 cin>>n; 14 for(int i=1;i<=n;i++)scanf("%d",a+i); 15 b[0][0]=c[n+1][0]=0; 16 b[0][1]=c[n+1][1]=-N; 17 for(int i=1;i<n;i++){ 18 b[i][0]=max(b[i-1][0],0)+a[i];//b[i][0]表示前i个数中选择包括a[i]在内的若干个连续数的最大值 19 b[i][1]=max(b[i-1][1],b[i][0]);//b[i][1]表示前i个数中选择若干个连续数的最大值 20 } 21 for(int i=n;i>1;i--){ 22 c[i][0]=max(0,c[i+1][0])+a[i]; 23 c[i][1]=max(c[i+1][1],c[i][0]); 24 } 25 int ans=-N; 26 for(int i=1;i<n;i++) 27 ans=max(ans,b[i][1]+c[i+1][1]); 28 cout<<ans<<endl; 29 } 30 return 0; 31 }