poj 2593 最大子段和

和poj 2

#include<stdio.h>
#include<string.h>

int num[500100];
int leftmax[500100];
int rightmax[500100];
int pre[500100];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,zmax,l,r;
while(scanf("%d",&n)&& n!= 0)
{
memset(leftmax,0,sizeof(leftmax));
memset(rightmax,0,sizeof(leftmax));
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
int max_pre;
max_pre = -20000;
for(int i=0;i<n;i++)

scanf("%d",&num[i]);

leftmax[0] = num[0];
for(int i=1;i< n;i++)
{
leftmax[i]=max(leftmax[i-1]+num[i],pre[i-1]+num[i] );
pre[i-1] = max_pre;
if(leftmax[i] > max_pre)
max_pre = leftmax[i];
l =leftmax[i];
}
pre[0] = num[0];
pre[n-1] = l;
for(int i=0;i<n;i++)
{
leftmax[i] = pre[i];

}
max_pre = -20000;
memset(pre,0,sizeof(pre));
rightmax[n-1] = num[n-1];
for(int i=n-2; i>=0;i--)
{
rightmax[i] = max(rightmax[i+1]+num[i],pre[i+1]+num[i]);
pre[i+1] = max_pre;
if(rightmax[i] > max_pre)
max_pre = rightmax[i];
r = rightmax[i];
}
pre[n-1] = num[n-1];
pre[0] = r;
for(int i=n-1;i>=0;i--)
{
rightmax[i] =pre[i];

}
zmax = -20000;
for(int i=0;i<n-1;i++ )
{
if(zmax < leftmax[i]+rightmax[i+1])
zmax = leftmax[i]+rightmax[i+1];
}

printf("%d\n",zmax);
}
}

479 一样,记得数组开大些

原文地址:https://www.cnblogs.com/lfyy/p/2768862.html