【LeetCode 983】门票的最低费用 Minimum Cost For Tickets

该博客主要介绍了LeetCode 983题目的解题思路和动态规划解决方案。题目要求在给定的电影票价格策略下,找出使总花费最低的购票方式。通过定义状态和状态转移方程,博主详细阐述了如何判断每日购买一日票、七日票或三十日票中的最优选择,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

题目:
在这里插入图片描述
即,给定一个数组代表你一年中的什么时候会去电影院,给定另外一个数组代表一日票,七日票,跟三十日票的金额,要求出如何买票,才能使花费最少。
在这里插入图片描述在这里插入图片描述
思路:
明显看出这个是一个动态规划的题目,因此我需要两步曲来完成,首先是状态的定义,我们发现,比如 days[1,2,3,5],我们要输出的是第5天所花费的最少金额,而且 days是严格递增的,所以我们只要求出第days[days.length - 1]的花费就OK,因此可以定义状态dp[days[days.length - 1]]
定义好了状态,第二步就是看状态的转移方程,由于我们定义的状态是天数,我们需要做的,就是从第0天的花费,递推到第days[days.length - 1]天的花费,而对于每一天,只有两种情况:
① 这一天不去看电影,则到达这一天的花费dp[i]为:dp[i] = dp[i - 1],跟前一天的花费是相同的
② 这一天去看电影,则我们要判断这一天需要买什么票,哪种票更合适,即我们判断我们是买一日票,还是过去七天用七日票,还是过去三十天用三十日票的总花费更低,因此判断dp[i - 1] + costs[0], dp[i - 7] + costs[1]), dp[i - 30] + costs[2]) 这三个数哪个最小,赋值为当前的dp[i]

代码:

    public int mincostTickets(int[] days, int[] costs) {
   
    	// 判断输入是否合法
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值