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!!!