第1关:递归方式解决数字三角形问题
本关任务:使用递归形式的动态规划(自顶向下),在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字的乘积最小,路径上的每一步都只能往左下或右下走,只需求出最小的乘积,不需要给出具体路径。 2 3 8 1 2 2 4 7 1 4 8 5 2 6 5
注意,必须使用动态规划表格,在测试输入中,有些输入的层数非常高,不使用动态规划会超时。
n = eval(input())
A=[]
for i in range(n):
X = A.append(list(map(int,input().split())))
def MinRouteProd(i,j):
########## begin ##########
# 请在此填写代码,返回以i,j为顶点的最小路径积
l=[A[0][0]]
for a in range(1,n):
ll=[]
ll.append(A[a][0]*l[0])
for aa in range(1,a):
ll.append(A[a][aa]*min([l[aa],l[aa-1]]))
ll.append(A[a][-1]*l[-1])
l=ll[:]
result=min(l)
########## end ##########
return result
print(MinRouteProd(0,0))
第2关:递推方式解决数字三角形问题
本关任务:改写第一关的程序,借助状态转移方程,使用递推的方式,完成数字三角形的路径最小乘积问题。
n = eval(input())
A=[]
for i in range(n):
X = A.append(list(map(int,input().split())))
def MinRouteProd(i,j):
########## begin ##########
# 请在此填写代码,返回以i,j为顶点的最小路径积
l=[A[0][0]]
for a in range(1,n):
ll=[]
ll.append(A[a][0]*l[0])
for aa in range(1,a):
ll.append(A[a][aa]*min([l[aa],l[aa-1]]))
ll.append(A[a][-1]*l[-1])
l=ll[:]
result=min(l)
########## end ##########
return result
print(MinRouteProd(0,0))
求求三连。。。