infinity

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  36 随笔 :: 0 文章 :: 25 评论 :: 0 Trackbacks
http://acm.pku.edu.cn/JudgeOnline/problem?id=2593
最大m子段问题,此题中m=2。方法还是DP,基本上还是用我们熟悉的最大子段和的方法。
读入数据是时做一次DP,得到从前往后到第i(0=<i<n)个元素处时的最大子段和,然后再
从后往前反向做一次DP,加上前面求得的正向的最大字段和即可求出一个最大值。

Memory: 988K Time: 172MS
Language: C Result: Accepted


#include<stdio.h>
int main()
{
    
int n,num[100000],MaxSum[100000];
    
while(scanf("%d",&n),n){
        
int i,sum=0,max=-100000,ret=-0x7fffffff;
        
for(i=0;i<n;i++) {
            scanf(
"%d",&num[i]);
            
if(sum>0) sum+=num[i];else sum=num[i];
            
if(sum>max) max=sum;
            MaxSum[i]
=max;
        }
        
for(max=-0x7fffffff,sum=0,i=n-1;i>=1;i--){
            
if(sum>0) sum+=num[i];else sum=num[i];
            
if(sum>max) max=sum;
            
if(max+MaxSum[i-1]>ret) ret=max+MaxSum[i-1];
        }
        printf(
"%d\n",ret);
    }
    
return 0;
}

posted on 2008-09-20 03:48 infinity 阅读(358) 评论(0)  编辑 收藏 引用 所属分类: acm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理