力扣题解 983

大家好,欢迎来到无限大的判断,祝大家国庆假期愉快

题目描述(中等)

最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。

火车票有 三种不同的销售方式 :

  • 一张 为期一天 的通行证售价为 costs[0] 美元;
  • 一张 为期七天 的通行证售价为 costs[1] 美元;
  • 一张 为期三十天 的通行证售价为 costs[2] 美元。

通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张 为期 7 天 的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。

返回 你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费 。

这道题是一个典型的动态规划问题,我们需要通过购买合理的火车票来最小化旅行的费用。对于给定的一组旅行天数 days 和各种票价 costs,我们要找到最低的总费用策略。
在这里插入图片描述


题目解析

输入/输出描述
  • 输入

    • 一个整数数组 days 表示你需要旅行的天数。
    • 一个整数数组 costs,其中 costs[0] 是为期一天的票价,costs[1] 是为期七天的票价,costs[2] 是为期三十天的票价。
  • 输出

    • 一个整数,即完成所有给定旅行天数所需的最低费用。
问题要求

对于需要旅行的每一天,我们有三种购买票的选择:一天,七天,或者三十天。我们要通过合理选择票种,在满足旅行需要的同时,使总花费最小。

解题思路

  1. 动态规划定义

    • dp[i] 表示从第 1 天到第 i 天的旅行最低费用。
  2. 转移方程

    • 如果第 i 天没有安排旅行,那么 dp[i] = dp[i-1]
    • 如果有旅行安排,dp[i] 可以从以下三种情况中得来:
      • 使用 1 天票:dp[i] = dp[i-1] + costs[0]
      • 使用 7 天票:dp[i] = dp[i-7] + costs[1](这里注意如果 i < 7,则 dp[i-7] 可以看作 0
      • 使用 30 天票:dp[i] = dp[i-30] + costs[2](这里注意如果 i < 30,则 dp[i-30] 可以看作 0
    • 我们选择三种情况中费用最低的方案:dp[i] = min(dp[i-1] + costs[0], dp[i-7] + costs[1], dp[i-30] + costs[2])
  3. 初始条件

    • dp[0] = 0(第 0 天不需花费)
  4. 最终目标

    • dp[days[i]],其中 i 是最大旅行日数,考虑只需处理在 days 中的天数。

C语言代码实现

#include <stdio.h>
#include <limits.h>int mincostTickets(int* days, int daysSize, int* costs, int costsSize) {int dp[366] = {0};  // Using 366 because days range from 1 to 365int dayIndex = 0;for (int i = 1; i <= 365; i++) {if (dayIndex >= daysSize || i != days[dayIndex]) {dp[i] = dp[i - 1];} else {int oneDayPass = dp[i - 1] + costs[0];int sevenDayPass = dp[i - 7 > 0 ? i - 7 : 0] + costs[1];int thirtyDayPass = dp[i - 30 > 0 ? i - 30 : 0] + costs[2];dp[i] = fmin(oneDayPass, fmin(sevenDayPass, thirtyDayPass));dayIndex++;}}return dp[days[daysSize - 1]];
}int main() {int days[] = {1, 4, 6, 7, 8, 20};int costs[] = {2, 7, 15};int result = mincostTickets(days, 6, costs, 3);printf("Minimum cost: %d\n", result);return 0;
}

C++代码实现

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int mincostTickets(vector<int>& days, vector<int>& costs) {vector<int> dp(366, 0);int n = days.size();int dayIndex = 0;for (int i = 1; i <= 365; i++) {if (dayIndex >= n || i != days[dayIndex]) {dp[i] = dp[i - 1];} else {int oneDayPass = dp[i - 1] + costs[0];int sevenDayPass = dp[max(0, i - 7)] + costs[1];int thirtyDayPass = dp[max(0, i - 30)] + costs[2];dp[i] = min({oneDayPass, sevenDayPass, thirtyDayPass});dayIndex++;}}return dp[days[n - 1]];
}int main() {vector<int> days = {1, 4, 6, 7, 8, 20};vector<int> costs = {2, 7, 15};int result = mincostTickets(days, costs);cout << "Minimum cost: " << result << endl;return 0;
}

算法分析

  • 时间复杂度:O(n),其中 ndays 的大小,因为我们只遍历每一个旅行天数,并对其更新一次。
  • 空间复杂度:O(365),主要用于 dp 数组的存储。
  • 该方案特别高效,因为对于每一个天数,我们只需决定三种选择中哪种最优,并且通过比较每次操作来更新 dp 的值。

结论

动态规划的关键在于将较大的问题划分为多个子问题,并从小到大不断求解。因此,通过合理地定义状态和状态转移方程,这个问题可以被有效解决。上述方案巧妙地利用了 dp 技巧,使得问题分析更为简洁,并能保证所需的最小费用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1552413.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

餐饮重点企业在AI领域的布局,看方大的AI实践

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI已经被应用在餐饮餐厨行业的哪些方面&am…

叶绿素透射反射率与波长

本文在分析巢湖水体反射光谱特征的基础上,通过对光谱反射率与叶绿素a 的浓度之间的关系进行分析研究,结果表明,单波段光谱反射率与叶绿素a浓度的相关系数较小,不宜用于估算叶绿素a浓度&#xff0e;光谱反射率比值RFo5.m/Rss.nm.和 690nm反射率的一阶微分均与叶绿素a浓度有较好的…

Chromium 用户数据目录User Data 初始化过程c++

一、先说结论 User Data 路径优先级如下&#xff1a; 1、注册表中策略配置的路径。 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Chromium UserDataDir"xx_path" 2、命令行中的路径。 --user-data-dir"xx_path" 3、默认用户路径 %LOCALAPPDATA%/Chrom…

buuctf---->[WUSTCTF2020]level3

做题笔记。 无语。 下载 查壳。 64ida打开。 先运行一下程序&#xff1a; 用它这个程序 加密romantic >>> cm9tYW50aWH 我们去正常加密看看&#xff1a; 仔细对比你会发现点毛病。 看看ida&#xff1a; 这表看起来&#xff0c;很正常&#xff0c;默认的为什么会加密不…

Python批量下载PPT模块并实现自动解压

日常工作中&#xff0c;我们总是找不到合适的PPT模板而烦恼。即使有免费的网站可以下载&#xff0c;但是一个一个地去下载&#xff0c;然后再批量解压进行查看也非常的麻烦&#xff0c;有没有更好方法呢&#xff1f; 今天&#xff0c;我们利用Python来爬取一个网站上的PPT&…

Java学习-网络编程

目录 1. 网络通信基本概念 1.1 通信 1.2 网络 1.3 协议 1.4 网络通信 1.5 网络通信协议 1.6 TCP/IP协议 1.7 互联网 1.8 计算机网络 2. TCP与UDP协议 2.1 TCP 2.2 UDP 2.3 TCP的三次握手 2.4 为什么要三次握手 2.5 TCP四次挥手 2.6 为什么要四次挥手 3. HTTP1…

代码随想录算法训练营Day18 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

目录 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 题目 530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值…

python16_引号使用

引号使用 A "Im a teacher!" B I\m a teacher! C """Im a teacher!, I am a teacher!, "I am a teacher!" """def single_quote(s):return sdef double_quote(s):return sdef triple_quote(s):return sif __name__ &qu…

【Linux】进程+权限管理+软硬链接+其他命令

目录 1. man手册 2. find按文件名称 3. find按文件类型 4. date显示时间 5. cal显示日历 6. du文件大小 7. ln链接 8. 软连接&#xff0c;硬链接区别 9. 文本查找 10. wc统计文本(计算文件的Bytes数、字数或列数) 11. 查看文本内容&#xff1a; 1…

单调队列与单调栈<2>——单调栈

单调栈的定义 单调递增栈 栈中元素从栈底到栈顶是递增的。 单调递减栈 栈中元素从栈底到栈顶是递减的。 单调栈的核心内容 我们从左到右遍历元素&#xff0c;构造单调栈&#xff08;从栈顶到栈底递增或减&#xff09;&#xff1a;在 i 从左往右遍历的过程中&#xff0c;我…

C语言、Eazy_x——井字棋

#include<graphics.h>char board_data[3][3] { { -,-,-},{ -,-,-},{ -,-,-}, };char current_piece o;//检测指定棋子玩家是否获胜 bool CheckWin(char c) {if (board_data[0][0] c && board_data[0][1] c && board_data[0][2] c)return true;if (…

数据结构-链表笔记

移除节点 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListN…

常见的VPS或者独立服务器的控制面板推荐

随着越来越多的企业和个人转向VPS和独立服务器以获得更高的性能和灵活性&#xff0c;选择合适的控制面板变得尤为重要。一个好的控制面板可以大大简化服务器管理&#xff0c;提高工作效率。本篇文章将介绍2024年最值得推荐的VPS控制面板&#xff0c;帮助您做出明智的选择。 1.…

python调用opencv报错“module ‘cv2‘ has no attribute ‘namedWindow‘”

之前电脑上使用pip install安装过opencv相关的python模块&#xff0c;不过后续学习opencv时主要使用OpenCVSharp在VS2022中创建项目测试。今天学习过程中突然想用python试试&#xff0c;不过运行下面代码时报错“module ‘cv2’ has no attribute namedWindow”。 import cv2c…

TVS管工作原理:【图文讲解】

TVS(Transient Voltage Suppressor)二极管&#xff0c;又称为瞬态抑制二极管&#xff0c;是普遍使用的一种新型高效电路保护器件&#xff0c;它具有极快的响应时间&#xff08;亚纳秒级&#xff09;和相当高的浪涌吸收能力。当它的两端经受瞬间的高能量冲击时&#xff0c;TVS能…

每日OJ题_牛客_DP2跳台阶_动态规划_C++_Java

目录 牛客_DP2跳台阶_动态规划 题目解析 C代码 Java代码 牛客_DP2跳台阶_动态规划 跳台阶_牛客题霸_牛客网 题目解析 当前值只和数组的前两个值有关&#xff0c;在往前面的就无关了&#xff0c;所以没必要申请一个数组&#xff0c;直接使用两个变量即可&#xff0c;这样空…

【数据结构与算法】时间复杂度和空间复杂度例题

文章目录 时间复杂度常数阶时间O(1)对数阶时间O(logN)线性阶时间O(n)线性对数阶时间O(nlogN)平方阶时间O(n*n) 空间复杂度常量空间O(1)线性空间O(n)二维空间O(n*n)递归空间 时间复杂度 常数阶时间O(1) 代码在执行的时候&#xff0c;它消耗的时间并不随着某个变量的增长而增长…

pytorch之梯度累加

1.什么是梯度&#xff1f; 梯度可以理解为一个多变量函数的变化率&#xff0c;它告诉我们在某一点上&#xff0c;函数的输出如何随输入的变化而变化。更直观地说&#xff0c;梯度指示了最优化方向。 在机器学习中的作用&#xff1a;在训练模型时&#xff0c;我们的目标是最小…

LeetCode[中等] 279.完全平方

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 1…

数值计算的程序设计问题举例

### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**&#xff1a;工程力学、建筑工程 **主要问题**&#xff1a;线性代数方程组&#xff08;Linear Algebraic Equations&#xff09; **解释说明**&#xff1a; 在结构静力分析中&#xff0c;我们需要解决复杂的…