过桥问题介绍

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

输入:

两行数据:第一行为小朋友个数n

                   第二行有n个数,用空格隔开,分别是每个小朋友过桥的时间。

输出:

一行数据:所有小朋友过桥花费的最少时间。

样例:

输入

4

1 2  5 10

输出

17

分析:

动态规划的线性模型

假设r[n]存储第i个人的速度(0~n-1)

分析可知有一些人要充当“跑腿”的作用,而“跑腿”又是在已经到对岸的人中选择,因此直觉上应该让速度快的人先过桥,于是我们将所有人的速度升序排序,依次考虑。

1.假设现在河两边各有一群人,到了送第i个人过河的阶段了,手电筒在对岸,我们需要选择“跑腿”,选择速度最快的人,这一定是最优决策,因此让r[0]回来。

2.此时河这边有r[0],r[i]~r[n-1],但此时让r[0]陪同r[i]过桥就不一定是最优决策了,因为r[i]与r[0]是否实力相差过于悬殊?r[0]会被拖累。

另一种策略是让r[i]和r[i+1]一起过桥,之后再由对岸选择一个“跑腿”(即r[1],此时他最快),然后由r[1]回来,r[1]和r[0]再一同过桥,这样让两个实力均衡的人一起,不会亏太多。

我们应该在以上两种策略中择优。

状态转移方程dp[i] = min{dp[i-1] + r[0] + r[i] , dp[i-2] + r[0] + r[i] + 2*r[1] }

注意上述决策的基本要求是,河对岸有大于等于两个人。因此要考虑基本情况

初始化dp[1]=r[1];dp[2]=r[2];dp[3]=r[2]+r[1]+r[3];

若输入人数小于等于3,则直接输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大富大贵7

很高兴能够帮助到你 感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值