poj 2479 最大子数段

 由题意通过提示可以知道 这组数据最大子数段是可以相连着呢,所以可以从左往右搜一次,然后从右往左搜一次,最后取最大值

比较注意

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

int num[50010];
int leftmax[50010];
int rightmax[50010];
int pre[50010];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n,zmax,l,r;
scanf("%d",&T);
while(T--)
{
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;
scanf("%d",&n);
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);
}
}

的是别弄混了

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