过桥问题, 动态规划详解, Java实现

题目

有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,最短需要多长时间才能过桥?

面试官求您了, 我真的不太会动态规划(小声
呜呜呜你出我也没办法, 我会加把劲做的

Link Start!

package baguwen;

public class Bridge {

    public static void main(String[] args) {
    	//!!这个people数组需要从小到大排序!!!
    	//如果给的不规范的话面试官怕不是还要你手撸个快排(x
    	//面试官:那再来谈谈快排如何优化吧
    	//我: ?
        int[] people = new int[]{1, 2, 5, 10};
        int[] sumTime = new int[people.length];

        //考虑前i - 1人过河的情况, 即河这边还有1个人, 河那边有i - 1个人, 并且手电筒肯定在对岸
        //sumTime[i] = sumTime[i - 1] + people[0] + people[i];
        //意思是让跑的最快的人送过来, 然后和第i个人一起过河

        //如果河这边有俩人, 一个是第i号, 另外一个无所谓, 河那边有i - 2人, 并且手电筒肯定在对岸
        //sumTime[i] = sumTime[i - 2] + people[0] + people[i] + 2 * people[1];
        //让花费时间最少的人把手电筒送过来, 然后第i个人和另外一个人一起过河
        //然后花费时间次少的人把手电筒送过来, 最少的和次少的再一起过河
        sumTime[0] = people[0];
        sumTime[1] = people[1];
        for (int i = 2; i < people.length; i++) {
            sumTime[i] = Math.min(sumTime[i - 1] + people[0] + people[i],
                    sumTime[i - 2] + people[1] * 2 + people[i] + people[0]);
        }
        System.out.println(sumTime[sumTime.length - 1]);


    }

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值