问题描述:
这道题乍一看,是一点头绪都没有。网上稍微搜索一下,发现可以用动态规划解决,再想到我的《算法导论》好像正好看到动态规划了,磨刀不误砍柴工,不如乘此机会学一下动态规划。
15.1 装配线调度(python实现)
e1,e2=2,4
a1=[7,9,3,4,8,4]
a2=[8,5,6,4,5,7]
t1=[2,3,1,3,4]
t2=[2,1,2,2,1]
x1,x2=3,2
length1=[0,0,0,0,0,0]
length2=[0,0,0,0,0,0]
length1[0]=e1+a1[0]
length2[0]=e2+a2[0]
for i in range(1,5+1):
#计算下一个length1
if length1[i-1] <= length2[i-1]+t2[i-1]:
length1[i]=a1[i]+length1[i-1]
else:
length1[i]=a1[i]+length2[i-1]+t2[i-1]
#计算下一个length2
if length2[i-1] <= length1[i-1]+t1[i-1]:
length2[i]=a2[i]+length2[i-1]
else:
length2[i]=a2[i]+length1[i-1]+t1[i-1]
print length1[5]+x1
print length2[5]+x2
15.2 矩阵链乘法(python实现)
p=[30,35,15,5,10,20,25]
A_num=len(p)-1
inf_num=999999999
m=[[0 for L in range(0,A_num)] for H in range(0,A_num)]
#s=[[0 for L in range(0,A_num)] for H in range(0,A_num)]
for i in range(0,A_num):
m[i][i]=0
for length in range(1,A_num):
for i in range(0,A_num-length):
j=i+length
m[i][j]=inf_num
for k in range(i,j):
tmp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]
if tmp < m[i][j]:
m[i][j]=tmp
#s[i][j]=k
print m[0][A_num-1]
学习完这个例子相信解决前面那个问题已经可以照葫芦画瓢了。
解题代码如下:
digit=[ [75],
[95,64],
[17,47,82],
[18,35,87,10],
[20,04,82,47,65],
[19,01,23,75,03,34],
[88,02,77,73,07,63,67],
[99,65,04,28,06,16,70,92],
[41,41,26,56,83,40,80,70,33],
[41,48,72,33,47,32,37,16,94,29],
[53,71,44,65,25,43,91,52,97,51,14],
[70,11,33,28,77,73,17,78,39,68,17,57],
[91,71,52,38,17,14,91,43,58,50,27,29,48],
[63,66,04,68,89,53,67,30,73,16,69,87,40,31],
[04,62,98,27,23, 9,70,98,73,93,38,53,60, 4,23] ]
m=[[0 for L in range(0,len(digit))] for H in range(0,len(digit))]
m[0][0]=digit[0][0]
for i in range(1,len(digit)):
for j in range(0,i+1):
if j<i:
if m[i][j]<m[i-1][j]+digit[i][j]:
m[i][j]=m[i-1][j]+digit[i][j]
if j>0:
if m[i][j]<m[i-1][j-1]+digit[i][j]:
m[i][j]=m[i-1][j-1]+digit[i][j]
tmp=0
for i in range(0,len(digit)):
if m[len(digit)-1][i]>tmp:
tmp=m[len(digit)-1][i]
print tmp