一个线性DP的经典入门题,不难,但是看到有的大神写出来的时间只有两位数的时间,最快的16MS,真是想破脑袋也做不到。
1 /*Memory:704K Time:422MS */ 2 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 int a[50001],left[50001],right[50001]; 7 void maxsum() 8 { 9 int t,n,i,res; 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%d",&n); 14 for(i=0;i<n;i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 left[0]=a[0]; 19 right[n-1]=a[n-1]; 20 for(i=1;i<n;i++) 21 { 22 if(left[i-1]<0)left[i]=a[i]; 23 else left[i]=left[i-1]+a[i]; 24 if(right[n-i]<0)right[n-i-1]=a[n-i-1]; 25 else right[n-i-1]=right[n-i]+a[n-i-1]; 26 } 27 for(i=1;i<n;i++) 28 { 29 left[i]=max(left[i],left[i-1]); 30 right[n-i-1]=max(right[n-i],right[n-i-1]); 31 } 32 res=-1000000; 33 for(i=1;i<n;i++) 34 { 35 res=max(res,left[i-1]+right[i]); 36 } 37 printf("%d\n",res); 38 } 39 } 40 int main() 41 { 42 maxsum(); 43 return 0; 44 }
时间: 2024-11-06 07:29:00