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;
}