1. 程式人生 > >分治法 解決最大欄位和問題

分治法 解決最大欄位和問題

分治法求解最大欄位和問題

1 問題描述

  給定由n個整數(可能由負數)組成的序列(a1, a2,...,an),最大欄位和問題求 該序列中連續子段和的最大值,並找出這個連續子段。

2 使用python程式設計解決,具體程式碼如下

 

# 求出最大子段和, 以及最大子段和 對應的位置,返回的位置 可能時亂序,由於是連續的,找出最大值和最小值,即確定位置
def max_sum(row_data, left, right):
    sum_max_sub = 0
    position_list = []
    if left == right:
        if
row_data[left] > 0: sum_max_sub = row_data[left] position_list.append(left) # 記錄下位置 else: sum_max_sub = 0 else: # 三種情況 center = (left + right) // 2 left_sum, left_position = max_sum(row_data, left, center) # 左側 連續子段最大和 right_sum, right_position = max_sum(row_data, center+1, right) #
右側 連續子段最大和 # 第三種情況, 從中間向兩側 的連續子段最大和 s1 = 0 # 用來記錄 子段和 lefts = 0 for i in range(center, left-1, -1): lefts += row_data[i] if lefts > s1: s1 = lefts position_list.append(i) s2 = 0 # 用來記錄 子段和 rights = 0
for j in range(center+1, right+1): rights += row_data[j] if rights > s2: s2 = rights # 在這個 找位置嗎?? position_list.append(j) sum_max_sub = s1 + s2 if sum_max_sub < left_sum: sum_max_sub = left_sum position_list = left_position if sum_max_sub < right_sum: sum_max_sub = right_sum position_list = right_position print("最大欄位和為:{}".format(sum_max_sub)) print("最大欄位和對應的索引:{}".format(position_list)) return sum_max_sub, position_list def max_main(): row_data = [-20, 11, -4, 13, -5, -2] max_sum(row_data, 0, len(row_data)-1) max_main()