一.动态规划
**动态规划(dynamic programming)**是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
二.动态规划之Fib数列
1.问题描述
有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶。走到N阶楼梯,一共有多少种走法?
2.问题分析
DP之自顶向下分析方式:
爬到第N阶楼梯,一共只有2种情况(全划分,加法原理),从第N-1阶爬1阶到第N阶;从第N-2阶爬2阶到第N阶;
故:way(N)=way(N-1)+way(N-2)
3.代码实现
def fib(n):
meno = [-1 for x in range(n+1)]
meno[0] = 0
meno[1] = 1
for i in range(2, n+1):
meno[i] = meno[i - 1] + meno[i - 2]
return meno[n]
三.任务安排问题
任务安排问题的代码实现:
def dp_opt(arr):
#计算任务的长度
len_arr = len(arr)
# 存储执行到每个任务可以获得的最优解;
opt = [0 for i in range(len_arr)]
opt[0] = 0
opt[1] = arr[1]
for i in range(2, len(arr)):
# 不选择做这个任务的最优解;
A = opt[i - 1]
# 选择做这个任务的最优解;
B = arr[i] + opt[prev[i]]
opt[i] = max(A, B)
return opt[-1]
print(dp_opt(arr))
四.不相邻数最大和
1.问题描述
问题描述: 给定数组A=[1,2,4,1,7,8,3],求出数组A中互不相邻的数的最大和。
例如:如果选择了8,则不能选择7和3,在本例中最大的和为1+4+7+3=15
2.代码实现
Arr = [0,1,2,4,1,7,8,3]
prev = [0,0,0,1,2,3,4,5]
def max_num(Arr):
len_Arr = len(Arr)
opt = [0 for num in range(len_Arr)]
opt[0]= 0
opt[1] = Arr[1]
for i in range(2, len(Arr)):
A = opt[i - 1]
B = Arr[i] + opt[prev[i]]
opt[i]= max(A, B)
return opt[-1]
print(max_num(Arr))