简介
参考链接 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 初始化二维数组
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》