0x01.问题

在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1365 的整数。
火车票有三种不同的销售方式:
一张为期一天的通行证售价为 costs[0] 美元;
一张为期七天的通行证售价为 costs[1] 美元;
一张为期三十天的通行证售价为 costs[2] 美元。
通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
返回你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费。

输入示例:days = [1,4,6,7,8,20], costs = [2,7,15]
输出示例:11
解释:例如,这里有一种购买通行证的方法,可以让你完成你的旅行计划:
在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。
在第 3 天,你花了 costs[1] = $7 买了一张为期 7 天的通行证,它将在第 3, 4, …, 9 天生效。
在第 20 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 20 天生效。
你总共花了 $11,并完成了你计划的每一天旅行。

提示:1 <= days.length <= 365 1 <= days[i] <= 365 costs.length == 3
1 <= costs[i] <= 1000 days 按顺序严格递增

C++函数形式为:int mincostTickets(vector<int>& days, vector<int>& costs)

0x02.分析

毫无疑问,这是一个动态规划的问题。

状态很简单,就是第i天的最低消费。关键在状态转移方程。

如果某一天,没有出行,那么最低消费就等于前一天的。

如果某天出行了,那么这一天一定要有票,按照贪心的原则,要想当天的成本最低,最理想的方法是一天的票刚好是今天买的,七天的票刚好是七天前买的,三十天的票刚好是三十天之前买的,再在这个当中去选择一个消费最低的情况。

这个分析的思路等于是,倒推买票的日期。

还必须考虑到一个特殊情况,就是如果没有七天,三十天前,也就是i<7或者i<30的情况,钱数应该是0dp数组的初始化应该也是0,为了方便知道某天是否出现,还可以设置一个标志数组。

状态转移方程为:

  • 当天出行 dp[i]=min(costs[0]+dp[i-1],costs[1]+dp[i-7],costs[2]+dp[i-30])(还需额外考虑i730大小)
  • 当天不出行 dp[i]=dp[i-1]

0x03.解决代码

class Solution {public:int mincostTickets(vector<int>& days, vector<int>& costs) {vector<int> dp(days.back()+1,0);vector<bool> istravel(days.back()+1,false);for(int day:days) istravel[day]=true;for(int i=1;i<dp.size();i++){if(istravel[i]==false) dp[i]=dp[i-1];else dp[i]=min(min(costs[0]+(i-1>0?dp[i-1]:0),costs[1]+(i-7>0?dp[i-7]:0)),costs[2]+(i-30>0?dp[i-30]:0));}return dp.back();}
};

ATFWUS --Writing By 2020–03–20

最低票价--用贪心的思想思考状态转移方程相关推荐

  1. [Leedcode][JAVA][第983题][最低票价][动态规划]

    [问题描述][第983题][最低票价][中等] 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出.每一项是一个从 1 到 ...

  2. 贪心算法思想详解+示例代码

    CSDN话题挑战赛第2期 参赛话题:学习笔记 文章目录 五大算法思想 贪心算法 举例说明 选择排序 删除数字 寻找数字最大和 买股票 最大回文字符串 背包问题 小结 五大算法思想 分治思想 贪心算法/ ...

  3. leetcode 983. Minimum Cost For Tickets | 983. 最低票价(动态规划)

    题目 https://leetcode.com/problems/minimum-cost-for-tickets/ 题解 没想出来,看了官方题解,难点在于如何列出 dp 的状态转移方程.我没想到它的 ...

  4. leetcode - 983. 最低票价

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

  5. 流浪地球票房43亿元 今起电影最低票价降10元

    [TechWeb]2月25日,国产科幻电影<流浪地球>累计票房突破43亿元,成为仅次<战狼2>的中国电影票房亚军,离<战狼2>的56亿票房还差13亿. <流浪 ...

  6. 20200506:最低票价(leetcode983)

    最低票价 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 本题是基础一维动态题,虽然很基础,但是还是想了很久,留下了菜的不行的泪水.dp[i]表示从当前天开始到今年结束为止旅行话费的最小支出 ...

  7. Leetcode 983.最低票价

    Time: 20190905 Type: Medium 题目描述 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出.每一项 ...

  8. 365天挑战LeetCode1000题——Day 103 400题 检查二进制字符串字段 最大子序列交替和 最低票价 K 站中转内最便宜的航班

    400题,用时103天,平均3.88题/天,预计154天,也就是5个月后完成目标 1784. 检查二进制字符串字段 代码实现(模拟) class Solution {public:bool check ...

  9. 力扣455.分发饼干(java)-贪心算法思想及基本步骤

    文章目录 贪心算法核心思想 基本步骤 455.分发饼干(Java) 1.需要考虑的问题 2.方案(序号分别与问题对应) 贪心算法核心思想 贪心算法的基本思想是每一步都做出当时看起来最佳的选择,可以理解 ...

最新文章

  1. IMT-2030(6G)推进组发布《6G总体愿景与潜在关键技术》白皮书
  2. css 解决fixed 布局下不能滚动的问题
  3. 让你的apache支持Perl
  4. [转载] 七龙珠第一部——第130话 悟空的敌人竟是悟空
  5. imread函数_MATLAB图像处理:27:使用imtranslate函数平移图像
  6. Java Tomcat
  7. zabbix监控Linux系统服务
  8. 论文笔记:Deep neural networks for YouTube recommendations
  9. UOS开启开发者模式
  10. SQL Server2005下载地址
  11. 2023秋招--广州光娱--游戏客户端--面经
  12. mysql 库存超卖_mysql处理高并发,防止库存超卖
  13. 【转】ARM经典300问
  14. 《MATLAB图像处理实例详解》:CH_7(图像分割技术)
  15. 基于数字温度传感器的数字温度计 华氏度和摄氏度
  16. 实体之间的关系主要有以下两种
  17. .py与.pyc文件的区别
  18. QT下的udp视频传输系统
  19. 猿如意中的【格式工厂】工具的安装与使用教程,格式转换这个工具就够了
  20. 视频工具箱和硬件加速

热门文章

  1. 二进制转换成十进制算法
  2. unity3D打开Visual Studio编写代码没有代码补全怎么回事
  3. 要封闭开发了,思考一下封闭开发的纪律条例,大家给点建议,10月18号前回复有效
  4. golang坑之 ‘godoc‘ 不是内部或外部命令
  5. 自动填写数据与自动点击锭钮提交数据
  6. python中形参和return语句_Python-return语句-函数的形参定义
  7. bzoj2440 [中山市选2011]完全平方数 容斥+莫比乌斯函数
  8. Tomcat源码分析之Catalina
  9. k8s存活探针的简介与使用
  10. F - Make Bipartite(dp)