每日一练之过桥问题

小朋友过桥

在这里插入图片描述

题目描述:假如有4个小朋友要过桥,它们的过桥时间分别为 1 2 5 10。求他们的最小过桥时间。
【步骤】

  1. 现由1号和2号过桥,花费时间为2,然后1送手电筒回来,花费时间1
  2. 再由3号和4号过桥。花费时间为10,然后再由2号送手电筒回来,花费时间2
  3. 最后,1和2一起过桥,花费时间2。
  4. 最后总时长 = 2 + 1 + 10 + 2 + 2 = 17
  • 状态定义:F(i):前 i 个小朋友过河所需的最短时间
  • 状态分析:
  1. 桥这头只有第 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个小朋友一起过桥所花费的时间。
    在这里插入图片描述
  2. 桥这头有两个个小朋友(其中一个为 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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值