编程之美-2.18 数组分割
对这篇博客,自己实现其中的第一种解法如下:
def array_split(arr):
half_sum = sum(arr) // 2 # 只找不大于sum/2的和
dp = [[] for _ in range(len(arr) + 1)] # dp[len(arr)][len(arr)//2][half_sum]
for i in range(len(arr) + 1):
for j in range(len(arr) // 2 + 1):
row = [False for k in range(half_sum + 1)]
dp[i].append(row)
# print(len(dp),len(dp[0]),len(dp[0][0])) # for debug
for i in range(1, len(arr) + 1):
j_max = min(i, len(arr) // 2)
for j in range(0, j_max + 1):
for s in range(half_sum + 1):
if i == 1:
if j == 0:
dp[i][j][0] = True
if j == 1:
dp[i][j][arr[i-1]] = True
smaller_sum = arr[i-1]
else:
if j <= i - 1:
if dp[i-1][j][s] == True:
dp[i][j][s] = True
smaller_sum = s
if s >= arr[i-1] and dp[i - 1][j - 1][s - arr[i-1]] == True:
dp[i][j][s] = True
smaller_sum = s
smaller_arr = []
i = len(arr)
j = len(arr) // 2
curr_sum = smaller_sum
while i > 0 and j > 0:
if dp[i - 1][j - 1][curr_sum - arr[i-1]] == True:
smaller_arr.append(arr[i-1])
j -= 1
curr_sum -= arr[i-1]
else:
i -= 1
return smaller_arr[::-1]
if __name__ == '__main__':
arr = [2,3,3,6]
res = array_split(arr)
print(res)
这篇博客中提出了另一个不同于动态规划的O(NlogN)的解法,不过缺点就是不能保证分成的两个数组的长度相等。
posted on 2019-05-07 14:44 Frank_Allen 阅读(175) 评论(0) 编辑 收藏 举报