POJ 2479 Maximum sum

要求求出一串数列中不重合的两段子序列的和的最大值
思路:
正着求一遍最大子串和,记录在lmax数组中,再倒着求一遍最大子串和,记录在rmax中,这时求出的是包含a[i]的最大和lmax[i],rmax[i],还要将lmax,rmax更新成 其区间内的最大和,并不一定包括i,最后求出lmax[i] + rmax[i + 1]的最大值
   
     
#include < stdio.h >
int lmax[ 50000 ],rmax[ 50000 ],max;

int main(){
int cas,n,a[ 50000 ],i,j;
scanf(
" %d " , & cas);
while ( cas -- ){
max
= 0xf0000000 ;
scanf(
" \n%d " , & n);
for (i = 0 ; i < n; i ++ ){
scanf(
" %d " , & a[i]);
// dp
if (i == 0 ){
lmax[i]
= a[i];
}
else {
lmax[i]
= lmax[i - 1 ] > 0 ? lmax[i - 1 ] + a[i] : a[i];
}
}
// dp
for (i = n - 1 ; i >= 0 ; i -- ){
if (i == n - 1 ){
rmax[i]
= a[i];
}
else {
rmax[i]
= rmax[i + 1 ] > 0 ? rmax[i + 1 ] + a[i] : a[i];
}
}
// 更新lmax rmax
for (i = 1 ; i < n; i ++ ){
if (lmax[i] < lmax[i - 1 ])
lmax[i]
= lmax[i - 1 ];
}
for (i = n - 2 ; i >= 0 ; i -- ){
if (rmax[i] < rmax[i + 1 ])
rmax[i]
= rmax[i + 1 ];
}
for (i = 0 ; i < n - 1 ; i ++ ){ // 1<=s1<=t1<s2<=t2<=n
if (lmax[i] + rmax[i + 1 ] > max)
max
= lmax[i] + rmax[i + 1 ];
}
printf(
" %d\n " ,max);
}
return 0 ;
}

你可能感兴趣的:(poj)