PAT 最大子列和问题 (Python)
2015-06-28 23:52
661 查看
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中
1 <= i <= j <= K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
输入格式:
输入第1行给出正整数 K (<= 100000);第2行给出K个整数,其间以空格分隔。
输出格式:
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
输入样例:
输出样例:
Solution:
http://blog.csdn.net/sgbfblog/article/details/8032464 http://blog.csdn.net/superchanon/article/details/8228212
1. 暴力算法(brute force),时间复杂度O(n^2)
2. 分治算法(divide and conquer),一分为二,递归而治理,时间复杂度O(nlogn)
证明该算法的时间复杂度:
当N=1时,T(1)=1
当N>1时,T(N)=2T(N/2)+(N/2+N/2)
T(N)/N=2T(N/2)/N+N/N =>
T(N)/N-T(N/2)/(N/2)=1
假设T(N)/N=F(N),
F(N)-F(N/2)=1
此时,
F(N/2)-F(N/4)=1
F(N/4)-F(N/8)=1
......
F(2)-F(1)=1
将上式相加,F(N)-F(1)=k(logN)
F(N)=T(N)/N,所以F(N)=N+NlogN
3. 在线(动态规划)算法,时间复杂度O(n)
1 <= i <= j <= K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
输入格式:
输入第1行给出正整数 K (<= 100000);第2行给出K个整数,其间以空格分隔。
输出格式:
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
输入样例:
6 -2 11 -4 13 -5 -2
输出样例:
20
Solution:
http://blog.csdn.net/sgbfblog/article/details/8032464 http://blog.csdn.net/superchanon/article/details/8228212
1. 暴力算法(brute force),时间复杂度O(n^2)
def maxC1(ls): “brute force” l,x,res,ma,m,j,=len(ls),0,0,0,0,0 for i in range(l): if ls[i]<=0: x+=1 if x==l: return 0 while j<l: for k in range(j,l): res+=ls[k] if res>ma: ma=res res=0 if ma>m: m=ma ma=0 j+=1 return m
2. 分治算法(divide and conquer),一分为二,递归而治理,时间复杂度O(nlogn)
def maxC2(ls,low,upp): "divide and conquer" if ls is None: return 0 elif low==upp: return ls[low] mid=(low+upp)/2 #notice: in the higher version python, “/” would get the real value lmax,rmax,tmp,i=0,0,0,mid while i>=low: tmp+=ls[i] if tmp>lmax: lmax=tmp i-=1 tmp=0 for k in range(mid+1,upp): tmp+=ls[k] if tmp>rmax: rmax=tmp return max3(rmax+lmax,maxC2(ls,low,mid),maxC2(ls,mid+1,upp)) def max3(x,y,z): if x>=y and x>=z: return x return max3(y,z,x)
证明该算法的时间复杂度:
当N=1时,T(1)=1
当N>1时,T(N)=2T(N/2)+(N/2+N/2)
T(N)/N=2T(N/2)/N+N/N =>
T(N)/N-T(N/2)/(N/2)=1
假设T(N)/N=F(N),
F(N)-F(N/2)=1
此时,
F(N/2)-F(N/4)=1
F(N/4)-F(N/8)=1
......
F(2)-F(1)=1
将上式相加,F(N)-F(1)=k(logN)
F(N)=T(N)/N,所以F(N)=N+NlogN
3. 在线(动态规划)算法,时间复杂度O(n)
def maxC3(ls): “online” l=len(ls) res,ma=0,0 for i in range(l): res+=ls[i] if res>ma: ma=res elif res<0: res=0 return ma
相关文章推荐
- Python数据类型之列表
- Python字符串处理
- python3.x与python2.x不同点
- python __init__.py
- python遇到的问题解决方法的记录
- python设计经典Pong 游戏
- Python——特殊属性与方法
- Python并发处理
- python刷取CSDN博文访问量之四
- python刷取CSDN博文访问量之三
- python刷取CSDN博文访问量之二
- python刷取CSDN博文访问量之一
- Python源码剖析笔记3-Python执行原理初探
- Python requests 自动登录某财BBS,自动签到打卡领铜钱,最后再配个plist,每天自动执行
- 用python获取MAC地址和IP地址
- python中的面向对象编程
- Python学习笔记 - function调用和定义
- Python学习笔记 - function调用和定义
- win python3.4.3安装和环境变量配置
- Python学习笔记 - dict和set