题目
有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]);
}
}