pku2479

来源:互联网 发布:工厂 灭鼠 网络结构图 编辑:程序博客网 时间:2024/05/04 20:08

链接:http://poj.org/problem?id=2479


/***************************************************************Author: LuckyQueentime: 2011.12.03    19:42Problem solution: 比较水的dp就是双向的最大连续字段和***************************************************************/#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define max(A,B) ((A) >= (B) ? (A) : (B))const int INF = 100005;int main(){    int n, m, temp;    while (scanf("%d", &n) != EOF)    {        int a[100005];        while (n--)        {            scanf("%d", &m);            for (int i = 1; i <=m; i++)                scanf("%d", &a[i]);            int lt[INF];            int dp[INF];            int rt[INF];            dp[m+1] = dp[0] = -INF;            lt[0] = rt[m+1] = -INF;            //正向求。从左向右求dp[i]、lt[i]            for (int i = 1; i <= m; i++)                dp[i] = max(dp[i-1]+a[i],a[i]);            for (int i = 1;i <= m; i++)                lt[i] = max(dp[i],lt[i-1]);            //逆向求。从右向左求dp[i]、rt[i]            for (int i = m; i >= 1; i--)                dp[i] = max(dp[i+1]+a[i],a[i]);            for (int i = m; i >= 1; i--)                rt[i] = max(dp[i],rt[i+1]);            //枚举两个子串的分隔点i            int sum = -INF;            for (int i = 1; i <= m; i++)                sum = max(sum,lt[i]+rt[i+1]);            printf("%d\n",sum);        }    }    return 0;}



LuckyQueen is the best!!!

原创粉丝点击