每日一练之过桥问题
小朋友过桥
题目描述:假如有4个小朋友要过桥,它们的过桥时间分别为 1 2 5 10。求他们的最小过桥时间。
【步骤】
- 现由1号和2号过桥,花费时间为2,然后1送手电筒回来,花费时间1
- 再由3号和4号过桥。花费时间为10,然后再由2号送手电筒回来,花费时间2
- 最后,1和2一起过桥,花费时间2。
- 最后总时长 = 2 + 1 + 10 + 2 + 2 = 17
- 状态定义:F(i):前 i 个小朋友过河所需的最短时间
- 状态分析:
- 桥这头只有第 i 个小朋友等待过桥,桥另一头有 前 i-1 个小朋友,并且手电筒也在这边。这时,需要从 i-1 个小朋友选一个给第 i 个小朋友送手电筒过去,然后再和他一起过来。很显然,我们应该选一个花费时间最短的小朋友送手电筒过去,那么就应该是第一个小朋友。
F(i) = F(i-1) + T[1] + T[i]
。F[i-1]表示前 i-1 个小朋友过桥所需要的最短时间,T[1]表示第一个小朋友送手电筒过去花费的时间,T[i] 表示第 i 个小朋友和第1个小朋友一起过桥所花费的时间。![]()
- 桥这头有两个个小朋友(其中一个为 i,另一个是哪个无所谓)等待过桥,桥另一头有 前 i-2 个小朋友,并且手电筒也在这边。这时,需要从 i-2 个小朋友选一个给第 i 个小朋友送手电筒过去,然后再和他一起过来。那么还是第1个小朋友送手电筒过去(T[1]),然后让原来桥这边的两个人一起过去(T[i]),然后再让次快者(也就是2号小朋友)送手电筒过去(T[2]),最后1号和2号一起过桥(T[2])。
F(i) = F(i-2) + T[1] + T[i] + T[2] * 2
![]()
- 状态转移方程:
F(i) = min(F(i-1) + T[1] + T[i], F(i-2) + T[1] + T[i] + T[2] * 2)
- 初始化
F(0) = 0;
F(1) = T[1];
F(2) = T[2];- 返回值
F(n)