动态规划-小朋友过桥问题

 

题目:在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。

 

解题思路:

方案一、耗时最少的人作为传递,即使用贪心法:每次都由耗时最少的人陪同过河,同时将电筒返回

T(n) = T(n-1)+cost[n] + cost[1]

 

方案二、耗时最少的两人作为传递:目的将耗时最大两人先送到对岸

T(n) = T(n-2)+cost[n] + cost[1]+2cost[2]

过程:

动态规划-小朋友过桥问题_第1张图片

由此可知:

问题T(n)可以分解为T(n-1)和T(n-2)的子问题,然后求这两个子问题中的最优解则为T(n)的最优解:

动态规划-小朋友过桥问题_第2张图片

解决方案:

获取输入值并进行排序处理:

动态规划-小朋友过桥问题_第3张图片

1、简单递归

动态规划-小朋友过桥问题_第4张图片

2、备忘录方式

从简单递归中可以看到会有很多重复计算,使用备忘录方式去除重复计算部分

动态规划-小朋友过桥问题_第5张图片

 

3、自底向上的方式

动态规划-小朋友过桥问题_第6张图片

显示结果:

动态规划-小朋友过桥问题_第7张图片

 

你可能感兴趣的:(python)