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