最近想看算法书,一不小心看到的一个小东西,好久没更,更上来看 看。
#coding=utf-8
# 计算和最大的子数组
def divide_a(low, high):
return (low + high) / 2
def combine_a(left_sub, right_sub, cross_sub):
if left_sub[2] > right_sub[2] and left_sub[2] > cross_sub[2]:
return left_sub
elif right_sub[2] > left_sub[2] and right_sub[2] > cross_sub[2]:
return right_sub
else:
return cross_sub
def find_max_cross(A, low, high, mid):
left_sum = 0
left_max_sum =A[mid]
left_max_low = mid
for i in range(mid, low-1, -1):
left_sum = A[i] + left_sum
if left_max_sum < left_sum :
left_max_low = i
left_max_sum = left_sum
right_sum = 0
right_max_sum = A[mid + 1]
right_max_high = mid + 1
for i in range(mid + 1, high+1):
right_sum = A[i] + right_sum
if right_max_sum < right_sum:
right_max_high = i;
right_max_sum = right_sum;
print (left_max_low, right_max_high, left_max_sum + right_max_sum)
return (left_max_low, right_max_high, left_max_sum + right_max_sum)
def divide_and_conquer_a(A, low, high):
#攻克
if low == high:
return (low, high, A[low])
#分解
mid = divide_a(low, high)
#递归
left_sub = divide_and_conquer_a(A, low, mid)
right_sub = divide_and_conquer_a(A, mid+1, high)
cross_sub = find_max_cross(A, low, high, mid)
#合并
return combine_a(left_sub, right_sub, cross_sub)
if __name__ == "__main__":
A = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
t = divide_and_conquer_a(A,0,15)
print t