Maximum path sum I [Project Euler.Problem 18]

问题描述:


这道题乍一看,是一点头绪都没有。网上稍微搜索一下,发现可以用动态规划解决,再想到我的《算法导论》好像正好看到动态规划了,磨刀不误砍柴工,不如乘此机会学一下动态规划。
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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值