【算法】【动态规划】过桥问题
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)); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-02-15 【Spring IOC】【二】容器源码解析- 获取单例 Bean
2023-02-15 【工具使用】IDEA Spring源码报Unable to find method ‘org.gradle.api.artifacts.result.ComponentSelectionReason