LeetCode 每日一题 Day 7(dp动态规划)

news/2024/6/16 10:49:00 标签: leetcode, 动态规划, 算法

leetcode.cn/problems/maximum-earnings-from-taxi/description/?envType=daily-question&envId=2023-12-08" rel="nofollow">2008. 出租车的最大盈利

你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi,愿意支付 tipi 元的小费。

每一位 你选择接单的乘客 i ,你可以 盈利 endi - starti + tipi 元。你同时 最多 只能接一个订单。

给你 n 和 rides ,请你返回在最优接单方案下,你能盈利 最多 多少元。

注意:你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。

示例 1:

输入:n = 5, rides = [[2,5,4],[1,5,1]]
输出:7
解释:我们可以接乘客 0 的订单,获得 5 - 2 + 4 = 7 元。
示例 2:

输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]]
输出:20
解释:我们可以接以下乘客的订单:

  • 将乘客 1 从地点 3 送往地点 10 ,获得 10 - 3 + 2 = 9 元。
  • 将乘客 2 从地点 10 送往地点 12 ,获得 12 - 10 + 3 = 5 元。
  • 将乘客 5 从地点 13 送往地点 18 ,获得 18 - 13 + 1 = 6 元。
    我们总共获得 9 + 5 + 6 = 20 元。

提示:

1 <= n <= 105
1 <= rides.length <= 3 * 104
rides[i].length == 3
1 <= starti < endi<= n
1 <= tipi <= 105

通过动态规划来记录每个阶段的最优解,避免了重复计算:

class Solution {
public:
    long long maxTaxiEarnings(int n, vector<vector<int>>& rides) {
        // 按照终点进行排序 lambda
        sort(rides.begin(), rides.end(), [](const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; });
        int m = rides.size();
        vector<long long> dp(m + 1);
        for (int i = 1; i <= m; ++i) {
            auto& ride = rides[i - 1];
            int start = ride[0], end = ride[1], tip = ride[2];
            // 寻找可以与当前订单不冲突的前一个订单
            auto it = lower_bound(rides.begin(), rides.begin() + i, start + 1, 
                [](const vector<int>& a, int val) { return a[1] < val; });
            // 计算当前订单的盈利,并更新动态规划数组
            int j = distance(rides.begin(), it);
            dp[i] = max(dp[i - 1], dp[j] + end - start + tip);
        }
        // 返回最终的最大盈利值
        return dp.back();
    }
};


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

相关文章

C++笔记:动态内存管理

文章目录 语言层面的内存划分C语言动态内存管理的缺陷new 和 delete 的使用了解语法new 和 delete 操作内置类型new 和 delete 操作自定义类型 new 和 delete 的细节探究new 和 delete 的底层探究operator new 和 operator new[]operator delete 和 operator delete[] 显式调用…

vim常见操作

vim常见操作 文章目录 vim常见操作1. 回退/前进2. 搜索3. 删除4. 定位到50行5. 显示行号6. 复制粘贴7. 剪贴8. 替换9. vim打开文件的时候出现 1. 回退/前进 1.esc进入命令模式 2.ctrlr 前进 u 回退2. 搜索 1&#xff09; esc进入命令模式 2&#xff09; /text  查找text&am…

皮具生产管理ERP系统有哪些模块?可以帮助企业解决什么难点

不同的皮具产品有差异化的生产工艺和制造流程&#xff0c;每道生产工艺的管理策略和难点各异&#xff0c;随着产品结构复杂化以及消费者对商品质量要求的提升&#xff0c;很多皮具生产企业也面临较大的经营压力。 当前有些皮具生产企业并不能做到内部各部门资源高效共享&#…

【数据结构c实现】顺序表实现

文章目录 线性表线性表的顺序实现结点结构结点初始化增配空间Inc打印顺序表show_list线性表长度length尾部插入push_back头部插入push_front尾部删除pop_back头部删除pop_front按位置插入insert_pos按值查找find按位置删除delete_pos按值删除delete_val排序sort(冒泡&#xff1…

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法&#xff0c;它是将数据分成互不相交的K类。K均值法先指定聚类数&#xff0c;目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小&#xff0c;规定聚类中心时则是以该类数据点的平均值作为聚类中心。 01K均值法原理与步骤 对于有N个…

NVIDIA Jetson NX ubuntu20.04删除多余版本冲突的Boost库

参考Ubuntu16.04 卸载旧版本Boost库并安装新版本 卸载 删除/usr/local/include/boost文件夹&#xff0c;删除/usr/local/lib中和boost有关的文件,以及/usr/local/lib/cmake/中boost的cmake文件 cd /usr/local/lib/ ls | grep boost sudo rm -rf /usr/local/include/boost su…

根据订单信息中的用户编号和订单日期和报刊编号统计出用户在订单日期时候订购的报刊名称

要根据订单信息中的用户编号、订单日期和报刊编号来统计用户在订单日期订购的报刊名称&#xff0c;您需要使用JOIN语句将"OrderInfo"表、"NewsInfo"表和"OrderDate"列连接起来&#xff0c;并添加适当的WHERE条件。 以下是一个示例查询&#xff0…

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线&#xff0c;连接起来&#xff0c;按照一定的规则&#xff0c;进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及&#xff0c;能够进行联网的设备将会是越来越多&#xff08…