hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++ 分类: hdoj 2015-07-12 03:24 87人阅读 评论(0) 收藏
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) 收藏的更多相关文章
- 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 ...
- 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) ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- Javascript中的集合
集合是由一组无序且唯一(即不能重复)的项组成 function Set() { var items={}; this.has=function(value){ //return value in it ...
- [地图SkyLine二次开发]框架(1)
项目介绍: 项目是三维地理信息系统的开发,框架MVC4.0 + EF5.0 + Extjs4.2 + SkyLine + Arcgis,是对SkyLine的二次开发. 项目快结束了,先给大家看一眼效果 ...
- c#winform程序退出的方法
一共有4种方式: 1.this.Close(); 只是关闭当前窗口,若不是主窗体,无法退出程序,另外若有托管线程(非主线程),也无法干净的退出: 2.Application.Exit();强制所有消 ...
- jvm之直接内存的影响
直接内存 直接内存是一个重要的问题,首先它不是运行数据区的部分也不是java虚拟机规范的一部分,这个的出现主要和java1.4后出现的NIO相关,一个基于通道和缓冲区的io方式,它可以使用Native ...
- centos各版本信息
CentOS version Architectures RHEL base Kernel CentOS release date RHEL release date Delay (days) 2.1 ...
- getParameterMap()的返回值为Map<String, String[]>,从其中取得请求参数转为Map<String, String>的方法如下:
直接遍历报错:[Ljava.lang.String;@44739f3f Map<String, String> tempMap = new HashMap<String, Strin ...
- 转:Linux内部的时钟处理机制全面剖析
Linux内部的时钟处理机制全面剖析 在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理等等.所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操 ...
- for循环立即执行和不立即执行,js闭包
<script type="text/javascript" src="jquery-2.1.1.min.js"></script> & ...
- webstorm node 3000端口被占用
首先说明我的问题原因,一个服务端程序用3000端口打开后,未关闭,直接强制关闭的webstorm,关闭的时候提示disconnect了,也点击了,但是打开另外一个文件,再用3000端口打开的话会提示被 ...
- [C语言入门笔记]循环与运算符
循环与运算符 什么是循环? 循环就是一个不停工作的东西,可以反复的实现一个功能,这个才是计算机的重点.计算机可以重复的做一件事情,这样子可以省很多事情 循环的种类有哪些? While Do while ...