首页 > 编程语言 >【算法】【动态规划】过桥问题

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

时间:2024-02-15 13:44:35浏览次数:21  
标签:arr int 个数 算法 过桥 小朋友 动态

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

 

标签:arr,int,个数,算法,过桥,小朋友,动态
From: https://www.cnblogs.com/kukuxjx/p/18016178

相关文章

  • 动态规划基础笔记
    背包问题 01背包  一般的动态规划要先考虑好状态,这个状态是一个集合,要能分成几个子集,然后从这些子集(小问题),推到这一整个集合(大问题),且求解过程是一样的,就可以可以转换成大问题分解成小问题一个一个求解,最后合并先要知道状态表示什么再要知道dp的属性,应该跟所求有关,只会......
  • 回溯算法模板
    回溯算法的模板通常包含递归函数和回溯过程。以下是一个通用的回溯算法模板:defbacktrack(start,path,other_parameters):#满足结束条件时,将当前路径加入结果ifsatisfies_end_condition:result.append(path[:])return#从start开始遍历可......
  • 动态规划题目合集
    3n多米诺问题\(dp[i]\)表示前\(i\)列的方案数,\(dp2[i]\)表示前\(i\)列但是最上面一行缺一个的方案数。\(dp[i],dp2[i]\)可以相互递推,而且刚好是矩阵递推。矩阵快速幂优化。Walk有向无权图。求长度\(k\)的路径条数。我们发现邻接矩阵的\(k\)次方各个元素求和就是......
  • 字符串KMP算法详解
    引入字符串kmp算法用于解决字符串匹配的问题:给出两个字符串\(s_1\)和\(s_2\),若\(s_1\)的区间\([l,r]\)子串与\(s_2\)完全相同,则称\(s_2\)在\(s_1\)中出现了,其出现位置为\(l\)。现在请你求出\(s_2\)在\(s_1\)中所有出现的位置。很显然,我们能够想到暴力求......
  • Tarjan 算法
    part1:离线求\(lca\)将走过的点且未回溯的标记为\(1\),已回溯的标记为\(2\),未访问标记为\(0\)把对于一点\(x\)的询问\(y\)存进相应的\(vector\),当回溯时判断如果询问的点标记为\(2\),则\(lca\)为询问的点\(y\)到根的路径上最早标记为\(1\)的点但直接找复杂度不对......
  • vue 父传子 props 静态属性和动态属性
    Props静态属性<template> <div>   <ConpentA title="我是静态props"/> </div></template><script> importConpentAfrom'./components/ConpentA.vue' exportdefault{  components:{   ConpentA......
  • 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Metho
    构造预处理矩阵M(对称正定)下图来自:预处理共轭梯度法(1)......
  • SQLSERVER:动态SQL
    --SqlServer动态Sql--动态SQL是指在运行时构造并执行的sql语句。这种技术在sqlserver中非常有用,尤其--是在需要编写灵活且可适应不同情况的代码时。动态sql可以用来创建通用的存储过程,--执行复杂的查询或者在运行时根据特定条件构建SQL语句。--优势与风险:--动态SQL的主要优势......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶
    110.平衡二叉树 题目链接:110.平衡二叉树-力扣(LeetCode)思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。同时要关......
  • URL编码算法:解决特殊字符在URL中的烦恼
    引言:URL编码算法是一种将URL中的特殊字符转换为特定格式的编码方式。它在网络传输中起到了保护数据安全与完整性的重要作用。本文将深入探讨URL编码算法的优点与缺点,并介绍它在Web开发、网络安全等方面的应用。URL编码解码|一个覆盖广泛主题工具的高效在线平台(amd794.com)h......