递归思路:
确定i=0和1时候的最大值,
从arr[i]=arr[-1]开始看,分两种情况:
选择arr[i]这个值:那么最好的结果为截至为前一个可以选择的数(即i-2)的最佳结果rec_opt(arr, i-2)加上arr[i]这个值
不选择arr[i]这个值:那么最好的结果为截至前一个数的最佳结果rec_opt(arr, i-1)
比较两种结果,选最大的值为最佳结果
*时间复杂度为O(2^n)
### recursion
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:
yes = rec_opt(arr, i-2) + arr[i]
no = rec_opt(arr, i-1)
return max(yes, no)
rec_opt(arr,len(arr)-1)
动态规划思路:
确定i=0和1时候的最大值,
从arr[2]开始计算出截至当前数的最佳选择,并记录最大和
*时间复杂度为O(n)
### dynamic programming
import numpy as np
arr = [1,2,4,1,7,8,3]
def dp_opt(arr):
opt = np.zeros(len(arr)) # [0 0 0 0 0 0 0]
opt[0] = arr[0] # opt = [1 0 0 0 0 0 0]
opt[1] = max(arr[0],arr[1]) # opt = [1 2 0 0 0 0 0]
for i in range(2,len(arr)):
yes = opt[i-2] + arr[i]
no = opt[i-1]
opt[i] = max(yes,no)
return(opt[-1]) # opt = [1 2 5 5 12 13 15]
dp_opt(arr) # 15