the algorithm of three version below is essentially the same, namely, Kadane’s algorithm, which is of O(n) complexity. https://en.wikipedia.org/wiki/Maximum_subarray_problem

the evolution of the implementations is to remove redundancy and do what is really needed, the side effect of doing so is becoming more efficient.

IMHO, version 1.0.2 is well commented which shows the guidelines of efficient bookkeeping of boundaries, first and last can also be easily changed to first_iter and last_iter to print the whole subarray if needed.

// version 1.0.0, a coordinate array, a traversing to find the first element

#include <cstdio>
#include <algorithm> #define MAXSIZE 10005 int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int N,i,tmp,*p;
int nums[MAXSIZE]={-1}, dp[MAXSIZE]={0};
while(scanf("%d",&N)==1 && N>0) {
for(i=1;i<=N;++i) { scanf("%d",&nums[i]); }
for(i=1;i<=N;++i) {
tmp=nums[i]+(dp[i-1]>0?dp[i-1]:0);
dp[i]=tmp>0?tmp:0;
//dp[i]=std:max(0,nums[i]+std::max(dp[i-1],0));
}
p=std::max_element(dp,dp+N+1);
if(p==dp) {
if(nums==std::max_element(nums,nums+N+1)) { i=1,tmp=N; }
else {
for(i=0;i<=N && nums[++i]<0;) {}
for(tmp=i;nums[++tmp]==0;) {} --tmp;
}
}
else {
for(tmp=i=p-dp;i>0 && dp[--i]>0;) {}
for(;i>0 && nums[i]==0 && dp[--i]==0;) {} ++i;
}
printf("%d %d %d\n",*p,nums[i],nums[tmp]);
}
return 0;
}

// version 1.0.1, no coordinate array, modifying the data, a traversing to find first element

#include <cstdio>
#include <algorithm> #define MAXSIZE 10005 int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int N,i,j,tmp,last,sum;
int nums[MAXSIZE]={-1};
while(scanf("%d",&N)==1 && N>0) {
for(i=1;i<=N;++i) { scanf("%d",&nums[i]); }
for(sum=-1,last=nums[N],j=0, i=1;i<=N;++i) {
tmp=nums[i]+(nums[i-1]>0?nums[i-1]:0);
if(tmp>=0) {
if(tmp>sum) { sum=tmp; last=nums[i]; j=i; }
nums[i]=tmp;
}
}
if(sum==-1) ++sum;
else for(;j>0 && nums[--j]>=0;) {}
printf("%d %d %d\n",sum,nums[j+1],last);
}
return 0;
}

// version 1.0.2, no coordinate array, not modify data, no extra traversing to find boundary element

#include <cstdio>
#include <algorithm> #define MAXSIZE 10005 int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
// prev -- maxsum ending here, sum -- maxsum so far, res -- result
int N,i,first,last,tmp,sum,res,prev;
int nums[MAXSIZE];
while(scanf("%d",&N)==1 && N>0) {
for(i=0;i<N;++i) { scanf("%d",&nums[i]); }
for(res=prev=sum=-1,first=nums[0],last=nums[N-1], i=0;i<N;++i) {
if(prev<0) {
if(nums[i]>=0) {
// prev start increasing, update candidate of first -- tmp
tmp=prev=nums[i];
// update candidate of result -- sum
if(prev>sum) { sum=prev; }
}
}
else {
prev+=nums[i];
// prev stop increasing, update first, last, res
if(nums[i]<=0) { if(sum>res) { res=sum; first=tmp; last=nums[i-1]; } }
// update candidate of result -- sum
else if(prev>sum) { sum=prev; }
}
}
// update first, last, res, -- only if partial sum remain increasing
if(sum>res) { res=sum; first=tmp; last=nums[i-1]; }
// all negative
if(res==-1) ++res;
printf("%d %d %d\n",res,first,last);
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。// p.s. If in any way improment can be achieved, better performance or whatever, it will be well-appreciated to let me know, thanks in advance.

hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++ 分类: hdoj 2015-07-12 03:24 87人阅读 评论(0) 收藏的更多相关文章

  1. Hiking 分类: 比赛 HDU 函数 2015-08-09 21:24 3人阅读 评论(0) 收藏

    Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  2. HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup 分类: hdoj 2015-07-18 16:24 139人阅读 评论(0) 收藏

    a typical variant of LCS algo. the key point here is, the dp[][] array contains enough message to de ...

  5. Hdu 1506 Largest Rectangle in a Histogram 分类: Brush Mode 2014-10-28 19:16 93人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  6. Hdu 1010 Tempter of the Bone 分类: Translation Mode 2014-08-04 16:11 82人阅读 评论(0) 收藏

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. hdu 1082, stack emulation, and how to remove redundancy 分类: hdoj 2015-07-16 02:24 86人阅读 评论(0) 收藏

    use fgets, and remove the potential '\n' in the string's last postion. (main point) remove redundanc ...

  8. Hdu 1429 胜利大逃亡(续) 分类: Brush Mode 2014-08-07 17:01 92人阅读 评论(0) 收藏

    胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  9. PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

随机推荐

  1. caffe + ubuntu16.04 (version without GPU)

    This Guide is based on caffe github wiki guide (https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-1 ...

  2. Openstack+Kubernetes+Docker微服务实践之路--Kubernetes

    经过几番折腾终于搞定Kubernetes了,我们要在Openstack上部署Kubernetes集群,使用最新工具Kubeadm来安装,由于不能直接访问Kubernetes的源,我们需要一台可以穿墙的 ...

  3. 如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句

    How to convert the CriteriaOperator to a lambda expression, so, the latter expression can be used in ...

  4. [git] git代理及常用命令,远程桌面代理

     1.代理 公司只能内网,上外网只能用代理,坑货! 2. 更新代码命令    1)下载代码:git clone ------------    2) 指定目录: cd 文件名    3)git add ...

  5. JavaScript实现输入验证(简单的用户注册)

    1.先写用户注册页面userrAdd.jsp <body> <center> <form name="f1" id="f1" ac ...

  6. Swift函数的定义

    //: Playground - noun: a place where people can play import Cocoa //基本的函数 //************************ ...

  7. [Docker] Docker简介

    一.简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间 ...

  8. 处理某个json文件的代码

    # encoding=utf-8 import json,re with open('E:\\weather53892_20114.json','r') as f: data= f.readlines ...

  9. (转)apache和nginx的区别

    nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下ngin ...

  10. 解决Strokeit在win8下的图标问题和开机启动问题

    Strokeit目前和Windows 8有一点不兼容,就是运行之后,任务栏会有它的图标,看着很不爽,用兼容模式运行可解决这个问题,但是这样一来就不能开机自动运行了,本文主要解决这个问题.  (参考资料 ...