每日一题|871. 最低加油次数|动态规划、内层逆序遍历

news/2024/10/7 18:16:54 标签: 动态规划, 算法

题目分析:找到第一个能够实现当前油量能够行驶的最大距离大于等于目标距离,且加油次数最小的加油站和加油次数。

每次加油之后能够行驶的最大距离都是由上一次加油的距离决定的,因此使用dp。

1、dp数组定义

dp[i]是一个一维数组,表示加油i次后,能够行驶的最大距离。

2、dp数组递推

更新的目的:找到当前加油次数能够行驶的最大距离。

当遍历到加油站 stations[i] 时,假设在到达该加油站之前已经加油 j 次,其中 0≤j≤i,则只有当 dp[j]≥stations[i][0] 时才能在加油 j 次的情况下到达加油站 stations[i] 的位置,这是dp更新的条件。 

在加油站stations[i] 加油之后,共加油 j+1 次,可以行驶的英里数是 dp[j]+stations[i][1]。遍历满足 0≤j≤i 且 dp[j]≥stations[i][0] 的每个下标 j,计算 dp[j+1] 的最大值。

dp[j + 1] = max(dp[j + 1], dp[j] + feul)

3、dp初始化

dp的最大长度表示最多加油的次数,也就是len(stations)。

dp是一个不断取最大值的过程,所有值初始化为0。

dp[0] = startFeul。

4、dp遍历顺序

外层i从小到大遍历全部的加油站,内层j从大到小遍历全部满足条件的加油次数,并更新dp。

为什么是从大到小遍历?

因为当前的dp都是以station[i]作为最后一站得到的,如果从小到大更新dp,将会重复计算feul的数量,得到一个当前i位置可以加油量的累计和,显然dp会越变越大。得到一个错误的结果。

class Solution:
    def minRefuelStops(self, target: int, startFuel: int, stations: List[List[int]]) -> int:
        dp = [startFuel] + [0] * len(stations)

        for i, (pos, fuel) in enumerate(stations):
            for j in range(i, -1, -1):
                if dp[j] >= pos:
                    dp[j+1] = max(dp[j+1], dp[j] + fuel)

        for i, dist in enumerate(dp):
            if dist >= target:
                return i
        return -1

http://www.niftyadmin.cn/n/5693181.html

相关文章

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

class 031 位运算的骚操作

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. 左程云的个人空间-左程云个人主页-哔哩哔哩视频…

专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结

目录 搜索 vs 深度优先遍历 vs 深度优先搜索 vs 宽度优先遍历 vs 宽度优先搜索 vs 暴搜 1.深度优先遍历 vs 深度优先搜索(dfs) 2.宽度优先遍历 vs 宽度优先搜索(bfs) 2.关系图暴力枚举一遍所有的情况 3.拓展搜索问题全排列 决策树 1. 计算布尔⼆叉树的值(medi…

redis——哨兵机制

redis中提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。 主从复制是实现redis高可用性的基石,从节点宕机时我们仍然可以将请求发送给主节点或者其他从节点,而当主节点宕机的时候,无法执行写操作,无…

如何在 SQL 中更新表中的记录?

当你需要修改数据库中已存在的数据时,UPDATE 语句是你的首选工具。 这允许你更改表中一条或多条记录的特定字段值。 下面我将详细介绍如何使用 UPDATE 语句,并提供一些开发建议和注意事项。 基础用法 假设我们有一个名为 employees 的表,…

SQL第12课挑战题

1. 返回customers表中的顾客名称(cust_name)和Orders表中的相关订单号(order_num),并按顾客名称再按订单号对结果进行排序。实际上是尝试两次,一次使用简单的等联结语法,一次使用inner join. 2. 让上一题变得更有用一些…

如何加入优质微信群:解锁微信社交的指南

在信息爆炸的时代,微信群作为连接人与人之间的重要桥梁,不仅承载着日常交流的功能,更成为了学习新知、拓展人脉、分享生活的多元平台。一个优质的微信群,就像是一座宝藏,能够让你在信息的海洋中找到有价值的珍珠&#…

力扣203.移除链表元素

题目链接:203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6…