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. 如何查看当前Linux的版本
  2. python operator 多属性排序_又碰到一个非常实用的模块,以后的各种运算就用它了,python内置的常用包。
  3. swift_002(Swift的String的基本使用)
  4. mysql-plus 动态修改全局sql, 进行数据隔离, 多租户, 多字段修改
  5. 【转】浅谈MS-SQL锁机制
  6. ASP.NET Core 源码学习之 Logging[2]:Configure
  7. 认识Linux系统中的inode,硬链接和软链接
  8. 晨哥真有料丨聊天就在一起了,真有这么简单吗?
  9. 1101 害死人不偿命的猜想 PAT
  10. mysql seconds_behind_master_MySQL同步状态双Yes的假象及seconds_behind_master的含义
  11. 矩形计算器java代码_java代码---------计算器实现
  12. ubuntu 14.04 安装中文输入法fcitx
  13. 【TSP】基于matlab遗传算法求解中国35省会城市旅行商问题【含Matlab源码 1222期】
  14. 西门子plc选型该看哪些参数
  15. cad刷新快捷键_47个CAD快捷键+50个技巧,了解这些CAD操作,你就偷着乐吧
  16. 游戏音效常见格式以及优缺点
  17. ssd1306 oled 行扫描方式
  18. Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址)
  19. 2019最新PayPal提现被退回的解决办法解析!
  20. 怎么修改html上的文字大小,网页字体大小怎么改_电脑网页字体怎么调整-win7之家...

热门文章

  1. Win10任务栏卡死怎么办?这3个方法快收藏!
  2. PHP几种常用的魔术方法
  3. Java网络编程小结
  4. Excel:录制简单的宏(三)
  5. idea中文翻译插件
  6. C语言实现简单解释器(interpreter)
  7. 微服务之Nacos注册与配置
  8. 平面设计和3D建模学哪个好?前景、薪资、技能需求各方面对比
  9. Shallow-Deep Networks: Understanding and Mitigating Network Overthinking
  10. 入门级git使用和github注册