poj 2593 最大子段和

本文提供了一种解决POJ 479问题的C语言实现方案,通过预处理数组计算最大子数组之和,分别从左到右和从右到左进行遍历以找出最优解。

和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/archive/2012/11/13/2768862.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值