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;
}
posted @ 2011-04-20 22:50  L..  阅读(158)  评论(0编辑  收藏  举报