ACM1003—求子序列最大值
题目:求一个数字序列中的最大子序列及其下标
题目分解:
- 子序列位于前半段
- 子序列位于后半段
- 子序列位于中间段
解题思想:
-分别计算序列的前一半和以及后一半和,中间部分的序列最大值计算则是从mid开始,分别向前、后加和计算(s1和s2),若最终结果是位于中间段的,那就一定包含mid和mid+1两个数,则中间段的总和就为s = s1+s2.
具体代码
#!/user/bin/env python
#-*-coding:utf-8-*-
#compute the first and last part
def sub_sum(a,low,high):
#count = high-low+1
result1 = 0
for i in range(low,high+1):
result1 += a[i]
t = (result1,low,high)
return t
#compute the middle part
def max_sub_sum(a,n):
low = 0
high = n-1
if low == high:
if a[low]>0:
return a[low]
else:
return 0
else:
mid = n/2
#print "mid=%d"%mid
lefts = rights = s1 = s2 = i=0
start = j = k = mid
end = 0
for i in range(mid):
# print k
k = k-1
lefts += a[k]
# print lefts
if s1<lefts:
s1 = lefts
start = k
#print "start=%d" % start
for j in range(mid,n):
rights += a[j]
#print "*******"
#print a[j]
#print "*******"
if s2<rights:
s2 = rights
end = j
#print "end=%d"%end
#print "----"
#print s2
'''
print "-------"
print s1
print s2
print "-------"
'''
t2 = (s1+s2,start,end)
return t2
#compute the max of three
def max_sum():
a = map(int,raw_input("Please enter numbers:\n").split())
n = len(a)
mid = (n-1)/2
low = 0
high = n-1
lefts = rights = s = ()
lefts = sub_sum(a,low,mid)
rights = sub_sum(a,mid+1,high)
s = max_sub_sum(a,n)
print "--------"
print "|"
#print lefts
print rights
#print s
print "---------"
#print "=============="
if lefts[0]>s[0] and lefts[0]>rights[0]:
return lefts
if rights[0]>s[0]:
return rights
return s
def main():
select = raw_input("q ------- quit\ns ------- start\n")
if select == 's':
num = input("Please enter the time:\n")
i = 0
for i in range(num):
print "Case %d:\n" % i
result = max_sum()
print "========="
print result
print "========="
print "result=%d" % result[0]
print "index:%d...%d" % (result[1],result[2])
else:
print "End"
main()
遇到的问题
1.索引位置返回错误
问题描述:在max_sum()函数中返回的索引值和再main()函数中返回的索引值不同,当最大子序列位于两边时,main()函数中返回的索引值始终为[0,3]
**解决办法:**max_sub_sum()函数中的返回值有误,mid的初始值应该从中间值开始设置,而不是从0开始。
2.range()用法错误
问题描述:计算求和时的结果有误,少算一个正数。
解决办法: range(n)的内容为:0…n-1的值
[注]:range(a,b)的内容为:a…b-1的值
故在迭代过程中可以直接使用range(),而无需自己另设变量计数
总结
python的基础用法不熟练,并没有使用到python简洁的特性,还是要多练多学习,代码仍旧有不完善的地方,希望通过用ACM刷题能够掌握python,另外,尽量注意化简代码,感觉代码还是有很多冗余的部分。有错误欢迎指正!