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 ...
随机推荐
- 《简明python教程》笔记二
面向对象的编程: 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例.对象可以使用普通的属于对象的变量存储数据.属于一个对象或类的变量被称为域.对象也可以使用属于类的函数来具 ...
- An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
如果你和我一样遇到了这个问题,那么你就要检查你要操作的Model对象查询,更新操作的数据库上下文也就是DBContext是否一致.如果不一致也就是说你用AContext去查如AContext.SET& ...
- 关于xml配置实现AOP的小知识
除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们.在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2. ...
- react 学习笔记
1.Router 1.1 Histories React Router 是建立在 history 之上的.一个 history 知道如何去监听浏览器地址栏的变化, 并解析这个 URL 转化为 loca ...
- 【java项目小记--JManager】项目开始原因及github部署
--记于2016-8-11 毕业已三载,忽然想起大学时的毕业设计项目,想到曾在毕业答辩上说,会吸取老师点评并逐渐完善该项目.而今 老师点评已忘了个干净,项目也还是毕业时的样子,正好最近有些时间,打算兑 ...
- java maven strom 启动异常
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRich ...
- it转行了
国庆节后毅然的辞职了,辞职的还发生一些不愉快的事情,原来希望好去好来却不慌而散.接着便开始找工作,有过工作经验,找工作是容易些,不像刚毕业那会什么企业都没人要.因为实在是对it没感觉,所以找的都是销售 ...
- effective java —— 终结方法守卫者
目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...
- 基于PNotify的消息提示Demo(轮询)
需求:有些任务需要定时更新,获取最新的消息,这样就需要定时轮询,再者需要一种友好的提示. 以下就是使用PNotify插件的消息提示: 1.HTML代码 <!DOCTYPE html> &l ...
- sql行列旋转
一,行转列 先建立测试数据 if OBJECT_ID('week_income') is not null drop table week_income go create table week_in ...