POJ-2479-Maximum sum-双向dp-2次连续区间和

来源:互联网 发布:印刷厂软件 编辑:程序博客网 时间:2024/06/07 22:31

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

给出n个数,从中取出两端连续的区间,求他们的sum,   让你求出最大的sum,区间不能相交。


左边来一次 最大连续区间和,右边来一次最大连续区间和

dp_left[i]对应从左到右计算,从1到第i个位置的最大和

 dp_right[i]对应从右到左计算,从n到第i个位置的最大和


那么for一遍所有的 dp_left[i]+ dp_right[i+1] 取一个最大的

 

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std; int tm[50005]; int max(int a,int b){return a<b?b:a;}  int contrary_tm[50005];int dp_left[50005];int dp_right[50005];int n,m; void cal(int st,int ed,int dp[],int ttt[]) { int i,maxx=-1000000; int sum=0;  for (i=st;i<=ed;i++) {   sum+=ttt[i];if (sum>maxx) maxx=sum;  dp[i]=maxx; if (sum <0)  sum=0; }  }int main(){ int t; cin>>t; while(t--) {  cin>>n; int i; for (i=1;i<=n;i++) { scanf("%d",&tm[i]); contrary_tm[n-i+1]=tm[i]; }  cal(1,n,dp_left,tm);  cal(1,n,dp_right,contrary_tm); for (i=1;i<=n/2;i++) swap(dp_right[i],dp_right[n-i+1]);int  maxx=dp_left[1]+dp_right[2];  for (i=1;i<n;i++) maxx=max(maxx,dp_left[i]+dp_right[i+1]); printf("%d\n",maxx); }return 0;}

0 0