正月点灯笼-计划任务代码实现含选择路径打印(Python3)
有8个任务及对应的薪酬,求最大报酬及其中一条选择路径?
题目及解析见 B站-up正月点灯笼-动态规划 (第1讲)
Python3
def findPrev(i):
"""查找prev"""
for j in range(i - 1, 0, -1):
if task[j][1] <= task[i][0]:
prev[i] = j
return
prev[i] = 0
# 1.便于编号,数组首位用0占位
task = [(0, 0), (1, 4), (3, 5), (0, 6), (4, 7), (3, 8), (5, 9), (6, 10), (8, 11)]
v = [0, 5, 1, 8, 4, 6, 3, 2, 4]
k = len(task)
# 2.构造prev数组(值与索引映射自带关系)
prev = [0] * k
for i in range(k - 1, 0, -1):
findPrev(i)
# print(prev)
tail = [0] # 用于收集路径尾部
path = [] # path收集路径
# 3.动态规划
OPT = [0] * k # 用0初始化OPT数组
for i in range(1, k):
selected = OPT[prev[i]] + v[i]
unselected = OPT[i - 1]
OPT[i] = max(selected, unselected) # 转态转移方程
# 4.路径收集
# (1)收集路径尾部到tail
if max(selected, unselected) == selected:
tail.append(i)
else:
tail.append(tail[-1])
# (2)收集路径到path,路径需要翻转
tem = [] # 用于临时收集倒序的路径
tem.append(tail[i])
j = tem[-1]
while tail[prev[j]] != 0:
tem.append(tail[prev[j]])
j = tem[-1]
path.append(tem[::-1]) # 路径反转后追加到path
# print(OPT)
print(OPT[-1])
# print(path)
print(path[-1])
题目来源:B站-up正月点灯笼-动态规划 (第1讲)
#代码实现#


