ACM1003---求子序列最大值

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,另外,尽量注意化简代码,感觉代码还是有很多冗余的部分。有错误欢迎指正!

猜你喜欢

转载自blog.csdn.net/zuber123/article/details/79054218