POJ 2479 Maximum sum
来源:互联网 发布:我的世界java版本 编辑:程序博客网 时间:2024/04/30 08:39
/*** Author: johnsondu* Stratege: DP* ItemName: StepByStep to learn DP well* ProblemAndUrl: Maximum sum http://poj.org/problem?id=2479**/#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <cstdio>using namespace std ;#define MAXN 50005#define inf 0xfffffffint a[MAXN] ;int dp1[MAXN], dp2[MAXN] ; //记录当前的字段和int r1[MAXN], r2[MAXN] ; //分别表示从0开始和从n-1开始的当前最大字段和int n ;inline int Max (int a, int b){ return a > b ? a : b ;}void DP (){ for (int i = 1; i < n; i ++) { dp1[i] = Max (dp1[i-1] + a[i], a[i]) ; r1[i] = Max (r1[i-1], dp1[i]) ; } for (int i = n-2; i >= 0; i --) { dp2[i] = Max (dp2[i+1] + a[i], a[i]) ; r2[i] = Max (r2[i+1], dp2[i]) ; }}void print (){ int ans = -inf ; for (int i = 0; i < n-1; i ++) ans = Max (ans, r1[i] + r2[i+1]) ; printf ("%d\n", ans) ;}int main (){ int tcase ; //freopen ("data.txt", "r", stdin) ; scanf ("%d", &tcase) ; while (tcase --) { scanf ("%d", &n) ; for (int i = 0; i < n; i ++) { scanf ("%d", &a[i]) ; dp1[i] = dp2[i] = 0 ; r1[i] = r2[i] = -inf ; } r1[0] = dp1[0] = a[0] ; r2[n-1] = dp2[n-1] = a[n-1] ; DP () ; print() ; } return 0 ;}