POJ 2479 Maximum sum(DP)

来源:互联网 发布:matlab教程矩阵 编辑:程序博客网 时间:2024/06/05 11:22

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

应该是很水的一个DP,最大子段和,正方向求一次,反方向求一次,处理当前位置之前的最大值

枚举每一个位置获得最大值!

#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;#define maxn 60000#define MAX(a,b) (a>b?a:b)int rec[maxn],in[maxn],back[maxn];int n;int main(){    int i,j,k,t,a,ans;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        for(i=0;i<n;i++)        scanf("%d",&rec[i]);        in[0]=rec[0];        for(i=1;i<n;i++)        if(in[i-1]>0) in[i]=rec[i]+in[i-1];        else in[i]=rec[i];        back[n-1]=rec[n-1];        for(i=n-2;i>=0;i--)        if(back[i+1] > 0) back[i]=rec[i]+back[i+1];        else back[i]=rec[i];        a=in[0];        for(i=1;i<n;i++){            a=MAX(in[i],a);rec[i]=a;        }        a=back[n-1];        for(i=n-1;i>=0;i--){            a=MAX(a,back[i]);back[i]=a;        }        ans=in[0]+back[1];        for(i=0;i<n-1;i++){            ans=MAX(in[i]+back[i+1],ans);        }        printf("%d\n",ans);    }    return 0;}