hdu-1003 or 最大子序列和(四种解题方法)
首先,自己的第一想法是 找出两个相邻元素和最大的两元素,然后分别从左右再计算。
后来才知道错了= = ||。
(下面算法只是找到了最大和,未找元素下标)
- 复杂度为O(N * N * N)的算法,也是最暴力的解法
int maxsubseqsum(int *list,int n)
{int i,j,k;int thissum,maxsum=0;for(i=0;i<n;i++){thissum=0;for(j=i;j<n;j++){for(k=i;k<j;k++){thissum+=list[k];}if(thissum>maxsum){maxsum=thissum;}}}return maxsum;
}
- 在上述算法进行优化。上面有许多无用计算,我们可以把计算过的保存起来。复杂度为O(N*N)
int maxsubseqsum(int *list,int n)
{int i,j,k;int thissum,maxsum=0;for(i=0;i<n;i++){thissum=0;for(j=i;j<n;j++){thissum+=list[j];}if(thissum>maxsum){maxsum=thissum;}}return maxsum;
}
- 分治算法,复杂度
记总的的为T(N)=2T(N/2)(两个递归)+O(N)(跨界求和的循环),然后展开,为2^
kT(N/2^k)+kO(N),
直到2^k=N,所以有T(N)=NT(1)+lgN(就是lnN)o(N)=O(NlgN);
这个递归我理解了很长时间,哎。
就用这个例子吧
首先center=4;
(list,1,4)=8
{(list,1,2)=3{(list,1,1)=3;(list,2,2)=0;本是-2}(list,3,4)=5{(list,3,3)=5;(list,4,4)=0;本是-3}
}(list,5,8)=14
{(list,5,6)=11{(list,5,5)=4;(list,6,6)=7;本是-2}(list,7,8)=9{(list,7,7)=0,本是-6;(list,8,8)=9;}
}
接下来就是跨段和
从4 3 2 1 和 5 6 7 8分别计算,所得maxleft+maxright=17;
用max(8,14,17),故为17
int max3(int a,int b,int c)
{return a>b?a>c?a:c:b>c?b:c;/*if a>b{if a>cmax=aelsemax=c}else{if b>cmax=belsemax=c}*/
}
int divid_and_conquer(int *list,int left,int right)
{int max_left_sum,max_right_sum;int max_left_border_sum,max_right_border_sum;int left_border_sum,right_border_sum;int center,i;if(left==right){if(list[left]>0) return list[left];else return 0;}max_left_sum=divid_and_conquer(list,left,center);max_right_sum=divid_and_conquer(list,center+1,right);分段求和 max_left_border_sum=left_border_sum=0;for(i=center;i>=left;i--){left_border_sum+=list[i];if(left_border_sum>max_left_border_sum)max_left_border_sum=left_border_sum;}扫描右边 max_right_border_sum=right_border_sum=0;for(i=center+1;i<=right;i++){right_border_sum+=list[i];if(right_border_sum>max_right_border_sum)max_right_border_sum=right_border_sum;}return max3(max_left_sum,max_right_sum,max_right_border_sum+max_left_border_sum);
}
- 在线算法,复杂度为O(N),我们可以简单证明为最快的算法:所有数据必须要处理一遍,所以O(N)的算法最快,即只处理一遍数据。
int maxsubseqsum(int *list,int n)
{int thissum,maxsum;thissum=maxsum=0;for(int i=0;i<n;i++){thissum+=list[i];if(thissum>maxsum)maxsum=thissum;else if(thissum<0)thissum=0;//一旦出现负的,我们就不需要在往下加了}return maxsum;}
hdu-1003 or 最大子序列和(四种解题方法)相关推荐
- php xml对象解析_php解析xml 的四种简单方法(附实例)
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- python安装第三方库-python第三方库的四种安装方法
讲解一下python第三方库的四种安装方法 问题场景 (我的操作系统windows): 我使用pip install selenium 发现先爆出一大段黄色警告日志,最后是两段红色的错误日志,无法成功 ...
- python下载文件到本地-Python下载网络文本数据到本地内存的四种实现方法示例
本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io imp ...
- python token post403原因_Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法...
Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误 解决方法1: 注释掉此段代码,即可. 缺点:导致Django项目完全无法防 ...
- 51单片机有几个通用io口_51单片机IO口的四种使用方法
原标题:51单片机IO口的四种使用方法 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式 LED正极接VCC,负极接IO口 ...
- vue移动端html5页面根据屏幕适配的四种解决方法
最近做了两个关于h5页面对接公众号的项目,不得不提打开微信浏览器内置地图导航的功能确实有点恶心.下次想起来了的话,进行总结分享一下如何处理.在vue移动端h5页面当中,其中适配是经常会遇到的问题,这块 ...
- 计算机无法连接无线信号,win7系统连接无线信号时提示Windows无法连接到路由器名称的四种解决方法...
现如今网络发展速度非常快,无线网络已经普及了,使用率高了遇到的问题也就多了.比如有时候笔记本win7系统连接无线信号时出现"Windows无法连接到路由器名称"(如下图所示),该如 ...
- ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)
总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选 ...
- ios打包ipa的四种实用方法(.app转.ipa)
[原]ios打包ipa的四种实用方法(.app转.ipa) 总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏- ...
最新文章
- @Bean 与@Component的区别
- 人工智能技术,对智慧交通的发展带来巨大影响
- [poj] 2318 TOYS || 判断点在多边形内
- Scrapy定向爬虫教程(三)——爬取多个页面
- xgboost论文公式解析
- 事务概念和事务四大特性和隔离级别
- 端口镜像 流量过滤_在 AWS 云环境中滥用 VPC 流量镜像抓取网络流量
- Java 重写 多态性_Java 学习(12):重写(Override)与重载(Overload) 多态
- MYSQL数据库管理与应用
- Android OTA本地自动升级实现
- Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法
- 《京东话费充值系统架构演进实践》读后感
- MBTI职业性格在软件研发组织中不同岗位的分布研究
- 英语人机考试计算机算分吗,揭秘 | 英语“人机对话”听说考试提分策略 注意事项,收藏备用 !...
- 淘宝彩票移动项目开发实践
- 《ROS机器人开发实践》使用RoboWare创建talker和listener程序
- 禁用格式工厂的Bright Data
- java计算机毕业设计ssm智慧餐厅点餐管理系统
- dayjs,当年月周日
- VUE element-ui之上传身份证照片正反面详细代码