一道例题学会动态规划和递归(recursion)

我们需要找到到达每个地铁站花的最少的钱

这道题主要思路是递归,但是同一个站第一次坐两站只花两块钱增加了难度

代码在这里,主要递归就用一个函数shortest()完成了

我给这个4x4的sample二维数组赋值,按照上面的图让每个点等于这个站点需要花的钱

#use recursion to give each station a value
#sample是路线图, shortGraph是最便宜路线图
def shortest (sample, shortGraph,flag ,x ,y):
    #如果越界,直接return
    if x > 3 or x < 0 or y > 3 or y < 0:
        return
    #left 从左边到达这个点需要加的价格
    left = 10
    #up 从上面到达这个点需要加的价格
    up = 10
    #如果这个点左边无越界
    if x - 1 >= 0:
        #让到达左边的这个点的价格 加上 此时所在点的价格
        left = shortGraph[y][x-1] + sample[y][x]
    #如果这个点上面无越界
    if y - 1 >= 0:
        #同上
        up = shortGraph[y-1][x] + sample[y][x]
    #如果上面或者左边不是空
    if x - 1 >=0 or y-1>=0:
        #找到从左边和从右边来的价格比较低的那个
        #flag 这个二维数组用来记录到达每个点时 是否连续跑了两个相同线路的站
        if left <= up:
            if flag[y][x-1] != sample[y][x] and sample[y][x]==sample[y][x-1]:
                #如果是第一次连续到达两个同样的站点,只需要加2块钱
                left = shortGraph[y][x-1] + 2
                #让flag记录下来到达这个点时已经连续两个站点了
                flag[y][x] = sample[y][x]
                #如果连续跑三个同样站点
            if flag[y][x-1] == sample[y][x] and sample[y][x]==sample[y][x-1]:
                flag[y][x] = sample[y][x]
            shortGraph[y][x] = left
        else:
            #从up来的,同上
            if flag[y-1][x] != sample[y][x] and sample[y][x]==sample[y-1][x]:
                up = shortGraph[y-1][x] + 2
                flag[y][x] = sample[y][x]
            if flag[y-1][x] == sample[y][x] and sample[y][x]==sample[y-1][x]:
                flag[y][x] = sample[y][x]
            shortGraph[y][x] = up
    #最后访问这个点的右边和下面的点
    shortest(sample, shortGraph, flag, x+1,y)
    shortest(sample, shortGraph, flag, x,y+1)
#begin
#initialize the stations graph
stations = [[3 for i in range(4)] for i in range(4)]
for i in range(4):
    stations[0][i] = 1
for i in range(1,4):
    stations[1][i] = 4
for i in range(1,4):
    stations[i][0] = 2
stations[3][1] = 2
flag = [[0 for i in range(4)] for i in range(4)]
short = [[0 for i in range(4)] for i in range(4)]
shortest(stations,short,flag,0,0)
#printout the least cost graph
print(short)


最后的结果是

0234
2678
47911
681113

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lobster0722

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值