问题1:
给定一个数组[1 2 4 1 7 8 3],要求从该数组中选择某些数,使得这些数字的和最大,但需要满足条件:被选中的这些数字不能相邻。
递归方式:
递归方式代码(Python):
//arr=[1,2,4,1,7,8,3]
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]
B = rec_opt(arr,i-1)
return max(A,B)
rec_opt(arr,6)
//Output:15
但是递归方式的时间复杂度为O(2^n) 不是一种好的选择,所以我们用动态规划的方法(即非递归的方式)来改进代码
非递归代码如下:
import numpy as np
def dp_opt(arr,i)
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]
dp_opt(arr,6)