POJ 2593 dp

来源:互联网 发布:js过滤输入法表情符号 编辑:程序博客网 时间:2024/05/02 09:12
//11062096c00h00g2479Accepted984K438MSG++859B2012-11-29 14:25:42//分成两段left和right//left[i]表示包含aa[i]的最大连续字段和,right[i]表示从后向前包含aa[i]的最大字段和//由于left[i]并不能表示1-i的最大字段和,故需要设计一个变量ll来表示左端的最大值//错误原因; 见代码描述 #include<stdio.h>#include<stdlib.h>#include<limits.h>#include<algorithm>using namespace std;int n;int aa[100005];int left[100005];int right[100005];int main(){    while(scanf("%d",&n)!=EOF){        if(n==0)            break;        for(int i=1;i<=n;i++){             scanf("%d",&aa[i]);            left[i]=right[i]=0;        }        left[0]=right[n+1]=0;        //正向扫描         for(int i=1;i<=n;i++){            left[i]=max(aa[i],left[i-1]+aa[i]);        }        //逆向扫描         for(int i=n;i>=1;i--){            right[i]=max(aa[i],right[i+1]+aa[i]);        }        int res=-INT_MAX;        int ll=-INT_MAX;        //这儿写成<=n WA了一次,因为题目要求必须分割成两段         for(int i=1;i<n;i++){            ll=max(ll,left[i]);            res=max(res,ll+right[i+1]);        }        printf("%d\n",res);    }    //system("pause");    return 0;}