POJ 2479 Maximum sum

来源:互联网 发布:java程序员优秀简历 编辑:程序博客网 时间:2024/04/30 11:14

题意:给你一个数列,求出数列中不相交的两个子段和,要求和最大。

Sol:对于每个i来说,求出 [ 0 ~ i-1 ] 的最大子段和以及 [ i ~ n-1 ] 的最大子段和,在加起来,求一个最大的就可以了。

[ 0 ~ i-1 ] 的最大子段和从左向右扫描 , [ i ~ n-1 ] 从右向左扫描。

复杂度O(n)

#include <cstdio>#include <algorithm>using namespace std;const int maxn = 50000 + 10;int a[maxn],left[maxn],right[maxn];int main(){int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);left[0]=a[0];for(int i=1;i<n;i++){if(left[i-1]<0)left[i]=a[i];elseleft[i]=left[i-1]+a[i];}for(int i=1;i<n;i++)left[i]=max(left[i],left[i-1]);right[n-1]=a[n-1];for(int j=n-2;j>=0;j--){if(right[j+1]<0)right[j]=a[j];elseright[j]=right[j+1]+a[j];}for(int i=n-2;i>=0;i--)right[i]=max(right[i+1],right[i]);int res=-100000000;for(int i=1;i<n;i++)res=max(res,left[i-1]+right[i]);printf("%d\n",res);}return 0;}


0 0
原创粉丝点击