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

在这里插入图片描述
此题最难的是切入思路。我一开始纠结于过桥顺序的多种情况。后来发现思路要从时间最大者切入。时间最大者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 

猜你喜欢

转载自blog.csdn.net/baidu_37360677/article/details/108565590