动态规划编程题加课-手电过桥问题

在这里插入图片描述
此题最难的是切入思路。我一开始纠结于过桥顺序的多种情况。后来发现思路要从时间最大者切入。时间最大者t_n过桥的时间一定会被计入总时间,因为没有人可以带他。那么t_n过桥的顺序其实不重要,他过桥的策略只有两种:1. 带同伴过桥,同伴送手电回来。2. 带同伴过桥,第三者送手电回来。要有第三者回来,那么必然先于t_n, 有另外两人过河,然后二人中一个送回手电筒留在这边,t_n与同伴过河,先过河二人剩下的那个送回手电筒,此时对面留下了t_n与同伴。
第一种情况的最优解是带时间最小者t_1过桥,然后t_1回来,此时耗费时间为t_n+t_1。 第二种情况最优解是让t_1与t_2先过桥,时间为t_n+t_2+t_2+t_1。这时t_n过河的同伴是t_n-1收益最大。所以最后桥对面为t_n与t_n-1。
第一种策略的总最优时间是剩下的t_1:t_n-1的过河时间的子问题的最优解。即opt[n-1]+t_n+t_1. 第二种策略是opt[n-2]+t_n+t_1+2*t_2. 两种策略包含了所有的可能性,问题的总最优时间就是两种策略最优时间的取小者。
其次要考虑的是结束条件。两种策略剩下的没过桥的人数都不可能为一人,所以结束条件要考虑还有2人和3人两种情况,最优解分别为opt[2] = t_2与opt[3] = t_3+t_2+t_1. opt[4]开始就可以套用公式。
代码如下:

def get_min_time(time):
    time.sort()
    n = len(time)
    if n == 1:
        return time
    elif n == 2:
        return time[1]
    elif n == 3:
        return time[0]+time[1]+time[2]
    else:
        retur
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值