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


原创粉丝点击