1.定义
动态规划(英语:Dynamic planning,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
2.核心思想
把一个复杂问题不断拆分为子问题,逐个来解决。
万能公式:
3.例子
对于数列arr = [1,2,4,1,7,8,3],如何选择才能使得到的值最大,限制:相邻元素不可取。
import numpy as np
arr = [1,2,4,1,7,8,3]
def dp_opt(arr):
opt = np.zeros(len(arr)) #用0占位
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]
print(dp_opt(arr))
对于数列arr = [3,34,4,12,5,2],取出几个数字,使得相加为9。
arr = [3,34,4,12,5,2]
def rec_subset(arr,i,s):
if s == 0:
return True
elif i == 0:
return arr[0] == s
elif arr[i] > s:
return rec_subset(arr,i-1,s)
else:
A = rec_subset(arr,i-1,s-arr[i])
B = rec_subset(arr,i-1,s)
return A or B
print(rec_subset(arr,len(arr)-1,9))
import numpy as np
arr = [3,34,4,12,5,2]
def dp_subset(arr,S):
subset = np.zeros((len(arr),S+1),dtype=bool)
subset[:,0] = True
subset[0,:] = False
subset[0,arr[0]] = True
for i in range(1,len(arr)):
for s in range(1,S+1):
if arr[i] > s:
subset[i,s] = subset[i-1,s]
else:
A = subset[i-1, s-arr[i]]
B = subset[i-1,s]
subset[i,s] = A or B
r,c = subset.shape
return subset[r-1,c-1]
print(dp_subset(arr,9))