Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

时间:2022-11-14 00:32:49

Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets)


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

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

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

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

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

示例 1:

输入: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,并完成了你计划的每一天旅行。

示例 2:

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

提示:

  1. 1 <= days.length <= 365
  2. 1 <= days[i] <= 365
  3. days 按顺序严格递增
  4. costs.length == 3
  5. 1 <= costs[i] <= 1000

DP定义:

DP[i]表示从第1天到第i天的最低花费。

一年有365天,所以days里可能有365项,所以new一个大小为366的数组,因为后面会计算i-1,i-7,i-30,会下标溢出,所以把数组大小增大为396,然后把所有的日子全部向后推移30天防止溢出。

如果一天没有去旅行,那么花费就和前一天是一样的。

如果一天去旅行了,那么花费就可以在:

1、1天前的花费+天票

2、7天前的花费+周票

3、30天前的花费+月票

中取最小值,就是dp[i]了,即从第1天到第i天的最小花费。

dp初始化的时候,把有去旅行的日子标记一下(我这里是把有旅行的日子变成-1,没旅行的日子为0),然后计算。

看图(以示例1为例,红色框框住的是最低花费):

Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

讲解一下,以第38天为例:

在第37天,我的花费为7

到了38天,我要去旅游,我有3种方案:

日票:那么我可以在第37天买一张日票,这样我在第38天就可以用了,花费是第37天的花费+日票钱

周票:我可以在第31天买一张周票,有效期是第31-38天,那么我的花费是第31天的花费+周票钱

月票:我可以在第8天买一张月票,有效期是第8天-第38天,那我的总花费为第8天的花费+月票

...

以此类推

class Solution {
public int mincostTickets(int[] days, int[] costs) {
int[] dp = new int[396];
int dayCost = costs[0];
int weekCost = costs[1];
int monthCost = costs[2]; for (int i = 0; i < days.length; i++) {
dp[days[i]+30] = -1;
}
for (int i = 31; i <= 395; i++) {
if(dp[i]==0){
dp[i] = dp[i-1];
}else{
dp[i] = Math.min(Math.min(dp[i-1]+dayCost,dp[i-7]+weekCost),dp[i-30]+monthCost);
}
}
return dp[days[days.length-1]+30];
}
}

Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)的更多相关文章

  1. 【LeetCode】983&period; 最低票价 Minimum Cost For Tickets(C&plus;&plus; & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...

  2. LeetCode &vert; DP专题详解

    221 medium     221. Maximal Square Medium Given a 2D binary matrix filled with 0's and 1's, find the ...

  3. Leetcode之回溯法专题-37&period; 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

  4. 状压DP入门详解&plus;题目推荐

    在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...

  5. LeetCode 115&period;不同的子序列 详解

    题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...

  6. LeetCode 983&period; Minimum Cost For Tickets

    原题链接在这里:https://leetcode.com/problems/minimum-cost-for-tickets/ 题目: In a country popular for train t ...

  7. 力扣Leetcode 983&period; 最低票价

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

  8. LeetCode专题——详解搜索算法中的搜索策略和剪枝

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第20篇文章,今天讨论的是数字组合问题. 描述 给定一个int类型的候选集,和一个int类型的target,要求返 ...

  9. 【动态规划】树形DP完全详解!

    蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...

随机推荐

  1. Python中关于字符串的问题

    在Python里面,字符串相加经常会出现'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)这样的 ...

  2. ubuntu 解决 &OpenCurlyDoubleQuote;E&colon; Problem with MergeList &sol;var&sol;lib&sol;apt&sol;lists&sol;”错误

    这种错误的意思:无法解析或打开软件包的列表或是状态文件. 出现的原因:无法解析或打开软件包列表多数情况是安装的软件与本身系统有一些冲突之类的问题,或者曾在更新软件源或下载软件的时候意外中断造成的. 解 ...

  3. 【转】理解Java Integer的缓存策略

    本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性.首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为 ...

  4. Linux的一些常用快捷键和基本命令

    *******1.在Linux中,只有/能够当盘符,/首先要分配给系统盘所在分区*******2.swap交换分区,相当于Windows下的虚拟内存,用来模拟内存,当内存不够用时,就会使用交换分区.其 ...

  5. CreateFile&lpar;&rpar; 打开u盘 物理设备

    //以下是用的vs2010 windows7 64 管理员权限编译成功的 HANDLE hDev = CreateFile(TEXT("\\\\.\\PhysicalDrive1" ...

  6. &lbrack;OpenS-CAD&rsqb;屏幕坐标转换分析

    蓝色为地理坐标系XOY,记为坐标系A:黄色为屏幕坐标系xoy,记为坐标系B.地图的左下角点为(X0,Y0)可很容易的平移到坐标原点.因此这里只考虑地图位于坐标原点的情况,如图二也记为坐标系A. 设地理 ...

  7. 如何通过类找到对应的jar包

    ctrl+shift+T 然后输入对应类  

  8. Ehcache(08)——可阻塞的Cache——BlockingCache

    http://haohaoxuexi.iteye.com/blog/2119737 可阻塞的Cache—BlockingCache 在上一节我们提到了显示使用Ehcache锁的问题,其实我们还可以隐式 ...

  9. Java Web中web&period;xml的作用

    每一个javaWeb工程都有一个web.xml配置文件,那么他到底有什么作用呢?它是每一个web工程都必的必须的吗?   web.xml文件是用来初始化工程配置信息的,比如说welcome页面,fil ...

  10. 第十一节,利用yolov3训练自己的数据集

    1.环境配置 tensorflow1.12.0 Opencv3.4.2 keras pycharm 2.配置yolov3 下载yolov3代码:https://github.com/qqwweee/k ...