【算法】【动态规划】过桥问题
1 题目
在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。
输入:
两行数据:第一行为小朋友个数n
第二行有n个数,用空格隔开,分别是每个小朋友过桥的时间。
输出:
一行数据:所有小朋友过桥花费的最少时间。
样例:
输入
4
1 2 5 10
输出
17
2 解答
绞尽脑子:
/** * 过桥时间 * @param arr 每个人的耗时 升序的 * @return 最小过桥时间 */ public static int minTime(int[] arr) { int res = 0; if (arr == null || arr.length <= 0) { return res; } int len = arr.length; // 记录前 n 个人过桥的最小时间 int[] map = new int[len + 1]; // 只有一个人过桥 if (len == 1) { res = map[1] = arr[0]; // 两个人过桥 } else if (len == 2) { map[1] = arr[0]; res = map[2] = arr[1]; } else { // 大于等于三个人 map[1] = arr[0]; map[2] = arr[1]; for (int i = 3; i <= len; i++) { //boolean flag = 2 * arr[1] <= arr[i - 1]; //if (flag) { // map[i] = map[i - 2] + 2 * arr[1] + arr[0] + arr[i - 1]; //} else { // map[i] = map[i - 1] + arr[0] + arr[i - 1]; //} map[i] = Math.min(map[i - 1] + arr[0] + arr[i - 1], map[i - 2] + 2 * arr[1] + arr[0] + arr[i - 1]); } res = map[len]; } System.out.println(Arrays.toString(map)); return res; } public static void main(String[] args) { // 耗时 int[] arr = new int[]{1, 2, 5, 10}; System.out.println(minTime(arr)); }