poj 2593 Max Sequence(线性dp)

题目链接:http://poj.org/problem?id=2593

思路分析:该问题为求给定由N个整数组成的序列,要求确定序列A的2个不相交子段,使这m个子段的最大连续子段和的和最大。

该问题与poj 2479相同,解法也一样;

 

代码如下:

#include <cstdio>
#include <iostream>
using namespace std;

const int MAX_N = 100000 + 10;
int arr[MAX_N], dp_s[MAX_N], dp_r[MAX_N];
int arr_num;

int main(int argc, char *argv[])
{
    int temp_ans, sum, ans;
    
    while (scanf("%d", &arr_num) != EOF && arr_num != 0)
    {
        for (int i = 0; i < arr_num; ++i)
            scanf("%d", &arr[i]);

        temp_ans = INT_MIN, sum = 0;
        for (int i = 0; i < arr_num; ++i)
        {
            if (sum >= 0)
                sum += arr[i];
            else
                sum = arr[i];
            if (sum > temp_ans)
                temp_ans = sum;
            dp_s[i] = temp_ans;
        }

        temp_ans = INT_MIN, sum = 0;
        for (int i = arr_num - 1; i >= 0; --i)
        {
            if (sum >= 0)
                sum += arr[i];
            else
                sum = arr[i];
            if (sum > temp_ans)
                temp_ans = sum;
            dp_r[i] = temp_ans;
        }

        ans = dp_s[0] + dp_r[1];
        for (int i = 1; i < arr_num - 1; ++i)
        {
            int sum = dp_s[i] + dp_r[i + 1];
            if (sum > ans)
                ans = sum;
        }
        printf("%d\n", ans);
    }

    return 0;
}
posted @ 2015-05-23 00:20  Leptus  阅读(185)  评论(0编辑  收藏  举报