【算法】【动态规划】过桥问题

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));
}

 

posted @ 2024-02-15 13:40  酷酷-  阅读(84)  评论(0编辑  收藏  举报