POJ 2479
dp经典题
求一个数列内 不重叠的两段连续数段的最大和
lm[i]代表以a[i]结束的数段左边的最大和
rm[i]代表以a[i]开始的数段右边的最大和
r[i]代表i----n-1的最大连续字段和
1 #include <iostream> 2 #include <cstdio> 3 #include <string.h> 4 using namespace std; 5 const int N=50005; 6 int lm[N],rm[N],a[N],r[N]; 7 int n; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 scanf("%d",&n); 13 for(int i=0;i<n;i++)scanf("%d",a+i); 14 lm[0]=a[0]; 15 rm[n-1]=a[n-1]; 16 for(int i=1;i<n;i++){ 17 lm[i]=max(a[i],lm[i-1]+a[i]); 18 } 19 for(int i=n-2;i>=0;i--){ 20 rm[i]=max(a[i],rm[i+1]+a[i]); 21 } 22 r[n-1]=rm[n-1]; 23 for(int i=n-2;i>=0;i--)r[i]=max(r[i+1],rm[i]); 24 int ma=-100000000; 25 for(int i=1;i<n;i++){ 26 ma=max(ma,lm[i-1]+r[i]); 27 } 28 printf("%d\n",ma); 29 } 30 return 0; 31 }