有一个数组:arr = [1, 2, 4, 1, 7, 8, 3]
找出相加最大的和,选择的数不能相邻
该数组解为 1,4,7,3 和为15
题解:
b站视频讲解
https://www.bilibili.com/video/BV12W411v7rd?from=search&seid=16185215057279292603
从最后一个来是按照递归的思想,动态规划的思想是从数组的第三个元素开始,选或不选,然后求最大值,将值赋给opt数组,如此循环直到arr数组的最后一个,结束,返回opt[-1],即本题答案
Python:
import numpy as np
def rec_opt(arr, i): # 递归求解函数
if i == 0:
return arr[0]
elif i == 1:
return max(arr[0], arr[1])
else:
a = rec_opt(arr, i - 2) + arr[i] # a为选择数组最后一个元素,然后只能选第i-2个元素
b = rec_opt(arr, i - 1) # b为不选最后一个元素,所以就选择第i-1个元素
return max(a, b)
def dp_opt(arr): # 动态规划求解函数
opt = np.zeros(len(arr))
opt[0] = arr[0]
opt[1] = max(arr[0], arr[1])
for i in range(2, len(arr)):
a = opt[i - 2] + arr[i]
b = opt[i - 1]
opt[i] = max(a, b)
return opt[len(arr) - 1]
arr = [1, 2, 4, 1, 7, 8, 3]
p = dp_opt(arr)
q = rec_opt(arr, 6)
print(p, end='\t')
print(q)