您的位置:首页 > 编程语言 > Python开发

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。
输入样例:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: