Смог запустить, если кому интересно:
__author__ = 'denis'
def find_max_subarray(a, low, high):
if high == low:
return low, high, a[low - 1]
else:
mid = int((low + high) / 2)
left_low, left_high, left_sum = find_max_subarray(a, low, mid)
right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
return left_sum, left_high, left_sum
elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
return right_low, right_high, rigth_sum
else:
return cross_low, cross_high, cross_sum
def find_crossing(a, low, mid, high):
max_left = 0
max_right = 0
left_sum = -1e308
sum = 0
for i in range(mid, low, -1):
sum = sum + a[i]
if sum > left_sum:
left_sum = sum
max_left = i
max_right = 0
right_sum = -1e308
sum = 0
for j in range(mid + 1, high):
sum = sum + a[j]
if sum > right_sum:
right_sum = sum
max_right = j
return max_left, max_right, left_sum + right_sum
a = [-5, 5, 4, 3, -6, 55, 2,-1, 6, 3, 7, -5,-4, 33 -9, 6]
min, max, sum = find_max_subarray(a, 0, len(a))
print(min," ", max," ", sum)
Пользователь решил продолжить мысль [time]08 Декабрь 2015, 17:50:34[/time]:
Хотя все равно выдает не верный результат
Пользователь решил продолжить мысль 08 Декабря 2015, 22:48:09:
Кажется получилось заставить программу давать правильный ответ
__author__ = 'denis'
def find_max_subarray(a, low, high):
if high == low:
return low, high, a[0]
else:
mid = int((low + high) / 2)
left_low, left_high, left_sum = find_max_subarray(a, low, mid)
right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
return left_sum, left_high, left_sum
elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
return right_low, right_high, rigth_sum
else:
return cross_low, cross_high, cross_sum
def find_crossing(a, low, mid, high):
max_left = 0
max_right = 0
left_sum = -1e308
sum = 0
for i in range(mid, low, -1):
sum = sum + a[i]
if sum > left_sum:
left_sum = sum
max_left = i
max_right = 0
right_sum = -1e308
sum = 0
for j in range(mid + 1, high):
sum = sum + a[j]
if sum > right_sum:
right_sum = sum
max_right = j
return max_left, max_right, left_sum + right_sum
a = [13, -3, -25, 20, -3,- 16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
min, max, sum = find_max_subarray(a, 0, len(a))
print(min," ", max," ", sum)