PKU 2479 Maximum sum

本文介绍了一种求解最大子序列和问题的算法实现。通过将原始序列分为两部分,并分别计算左半部分(l(i))和右半部分(r(i))的最大子序列和,最终得出整个序列的最大子序列和。

分析:和上一题差不多,首先引入一个数m,m是在t1和s2之间的一个数,简单讲就是把序列分成两部分,然后两部分分别求最大子序列和,左边部分的最大子序列和为l(i),右边部分的最大子序列和为r(i)。那么问题变成了。

d(A) = max{ l(m)+r(m+1), 1<=m<=n }

 

ContractedBlock.gifExpandedBlockStart.gifCode
#include <iostream>
using namespace std;

int a[50001],l[50001],r[50002];
int main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
int t,n,sum,max;
    scanf(
"%d",&t);
    
while(t--)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        scanf(
"%d",&n);
        l[
0= -10001;
        sum 
= 0;
        
for(int i=1;i<=n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            scanf(
"%d",&a[i]);
            
if(l[i-1> a[i]+sum)
                l[i]
=l[i-1];
            
else
                l[i]
=a[i]+sum;
            sum
+=a[i];
            
if(sum<0)
                sum
=0;
        }

        r[n
+1= -10001;
        sum 
= 0;
        max 
= -200000;
        
for(int i=n;i!=0;--i)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if(r[i+1> a[i]+sum)
                r[i]
=r[i+1];
            
else
                r[i]
=a[i]+sum;
            sum
+=a[i];
            
if(sum<0)
                sum
=0;
            
if(l[i]+r[i+1]>max)
                max 
= l[i]+r[i+1];
        }

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

    
return 0;
}

转载于:https://www.cnblogs.com/jaskist/archive/2009/05/24/1488498.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值