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 ...
随机推荐
- &和&&
int j = 5,k = 3; if(!(j==k) && (j == 1 + k++ )) { } System.out.println(j); System.out.printl ...
- Javascript中的集合
集合是由一组无序且唯一(即不能重复)的项组成 function Set() { var items={}; this.has=function(value){ //return value in it ...
- lucene 搜索demo
package com.ljq.utils; import java.io.File; import java.util.ArrayList; import java.util.List; impor ...
- ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装
1.安装包 jdk1.7.0_71 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-188026 ...
- asp.net开发中遇到的奇葩bug及解决办法(会持续更新。。。)
1,不知道你们遇没遇到过,在vs2010或更高版本上运行程序的时候,完全没问题,放在IIS中出现了问题,就比如左侧是菜单项,点击菜单右边显示,如果菜单链接是这样:content.aspx,而另一个链接 ...
- MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)
回顾上一节,讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合 ...
- c++ is_space函数
C库函数int isspace(int c)检查传递的字符是否是空白. 标准空白字符: ' ' (0x20) space (SPC) ' ' (0x09) horizontal tab (TAB) ' ...
- viewPager + fragment
有两种实现方式,一种是 fragmentActivity + FragmentPagerAdapter (Fragment,FragmentManager需要导包:android.support.v4 ...
- Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享
架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...
- Loading加载小插件,用户可以选择html格式或canvas格式,自定义loading图片,canvas色彩搭配可根据个人喜好
;(function($) { $.Loading = function(options) { //暴漏插件默认值 $.Loading.defaults = { speed: 200, //弹出层淡出 ...