动态规划 POJ2479与POJ2593 最大子段和

来源:互联网 发布:秦皇岛人人网络 编辑:程序博客网 时间:2024/05/17 06:37

两道题是一样的 

做法   从左到右做子段和  再从右到左做子段和  最后枚举分割点

POJ2479的代码

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include <algorithm>#define ll long long#define eps 1e-8#define ms(x,y) (memset(x,y,sizeof(x)))#define fr(i,x,y) for(int i=x;i<=y;i++)using namespace std;const int maxn=100000+10,inf=0x3fffffff;int le[maxn],ri[maxn],num[maxn];void Left(int n){    ms(le,0);    int m=-inf,s=0;    for(int i=0;i<n-1;i++)    {            s+=num[i];            if(s>m)m=s;            if(s<0)s=0;            le[i]=m;    }}void Right(int n){    ms(ri,0);    int m=-inf,s=0;    for(int i=n-1;i>0;i--)    {            s+=num[i];            if(s>m)m=s;            if(s<0)s=0;            ri[i]=m;    }}int main(){    int T;    cin>>T;    int n;    while(T--)    {        cin>>n;        for(int i=0;i<n;i++)            scanf("%d",&num[i]);        Left(n);        Right(n);        int ans=-inf;        for(int i=0;i<n-1;i++)            ans=max(ans,le[i]+ri[i+1]);        cout<<ans<<endl;    }    return 0;}



0 0
原创粉丝点击