Chinaunix首页 | 论坛 | 博客
  • 博客访问: 342104
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

2010年(122)

我的朋友

分类: C/C++

2010-05-31 16:03:51

一、问题描述

 

二、解题思路

联想到最大子段和的求法。s[i]表示以i为起点的最大的子段和,t[i]表示以i结尾的最大的子段和。M1[i]表示1-i中的最大子段和,M2[i]表示i-n中的最大子段和。可知结果为res=max(M1[i]+M2[i+1])(1<=i时间复杂度为O(n)

 

三、代码

 

#include<iostream>
using namespace std;
int a[50005];
int s[50005];
int t[50005];
int T,n;
int main()
{
    scanf("%d",&T);
    int i,j;
    for(i=0;i<T;++i)
    {
        char ch[3];
        gets(ch);
        scanf("%d",&n);
        for(j=1;j<=n;++j)
            scanf("%d",&a[j]);
        t[0]=0;
        for(j=1;j<=n;++j)
        {
            if(t[j-1]<0)
                t[j]=a[j];
            else
                t[j]=t[j-1]+a[j];
        }
        int iMax=t[1];
        for(j=1;j<=n;++j)
        {
            if(iMax > t[j])
                t[j]=iMax;
            else
                iMax = t[j];
        }

        s[n]=a[n];
        for(j=n-1;j>0;--j)
        {
            if(s[j+1] > 0)
                s[j]=a[j]+s[j+1];
            else
                s[j]=a[j];
        }
        iMax=s[n];
        for(j=n-1;j>0;--j)
        {
            if(iMax > s[j])
                s[j]=iMax;
            else
                iMax=s[j];
        }
        iMax=-999999999;
        int temp;

        for(j=2;j<=n;++j)
        {
            temp=t[j-1]+s[j];
            if(temp > iMax)
                iMax=temp;
        }
        printf("%d\n",iMax);
    }
    return 0;
}


阅读(739) | 评论(0) | 转发(0) |
0

上一篇:有“道”难题

下一篇:冒泡排序算法

给主人留下些什么吧!~~