POJ 2593最大子序列

http://poj.org/problem?id=2593

题意分析:本题是要求两个子序列的和最大,所以设数组l[100010],l[i]表示从左到右0到i的子序列的最大和,然后从右向左找到i+1到n-1中最大的和,然后相加l[i],遍历一般就能的到最大值。而两步中先从左到右,后又从右到左,用的都是上一篇最大子序列中的简单法子,没用动态规划。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int l[100010];
int a[100010];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        int sum=0;
        int maxn=-0x7fffffff;
        for(int i=0;i<n;i++)
        {
            sum=sum+a[i];
            if(sum>maxn)
                maxn=sum;
            if(sum<0)
                sum=0;
            l[i]=maxn;
        }
        maxn=-0x7fffffff;
        sum=0;
        int summ=-0x7fffffff;
        for(int i=n-1;i>=1;i--)
        {
            sum=sum+a[i];
            if(sum>maxn)
                maxn=sum;
            if(sum<0)
                sum=0;
            if(summ<maxn+l[i-1])
                summ=maxn+l[i-1];
        }
        printf("%d\n",summ);
    }
    return 0;
}
View Code

 

posted @ 2013-08-13 11:23  拼搏今朝 努力奋进  阅读(203)  评论(0)    收藏  举报