简介
参考链接 https://space.bilibili.com/24014925/video?keyword=动态规划
example
选择不相邻的数字组成最大的数
import numpy as np
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] # 选中第i个值
B = rec_opt(arr, i - 1) # 不选第i个值
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]
print(rec_opt(arr, 6))
print(dp_opt(arr))
example 2
如何查看字符串中选中的任意个数的数字是否可以加起来等于我想要的数字
import numpy as np
arr = [3, 34, 4, 12, 5, 2]
def rec_opt(arr, i, s):
if s == 0:
return True
elif i == 0:
return arr[0] == s
elif arr[i] > s:
return rec_opt(arr, i-1, s)
else:
A = rec_opt(arr, i - 1, s - arr[i]) # 选中第i个值
B = rec_opt(arr, i - 1, s) # 不选第i个值
return A or B
def dp_opt(arr, s):
opt = np.zeros((len(arr), s+1) , dtype=bool)
# print(opt)
opt[:, 0] = True
opt[0, :] = False
opt[0, arr[0]] = True
for i in range(1, len(arr)):
for j in range(1, s+1):
if arr[i] > j:
opt[i, j] = opt[i-1, j]
else:
A = opt[ i - 1, j - arr[i]]
B = opt[ i - 1, j]
opt[i, j] = A or B
r, c = opt.shape
return opt[r-1, c -1]
print(rec_opt(arr, len(arr) - 1, 6))
print(dp_opt(arr, 13))
Tips
numpy 初始化二维数组