AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

P3396. Wonderland

中等通过率 64% · 提交 392 · 通过 251
动态规划贪心DP

小慕最近接手了一个游乐园的票务优化项目。这个游乐园提供4种门票:一日票(1天)、三日票(3天)、周票(7天)和月票(30天)。 每种门票的价格由一个数组给出,在票面有效期内可以无限次入园游玩。 例如,小慕在第10天购买了一张三日票,那么他可以在第10天、第11天和第12天任意进出游乐园。小慕计划在未来一年内多次前往这个游乐园。 小慕的游玩日期由一个数组给出。现在,请你根据门票价格数组和小慕的游玩日期数组,计算出完成所有游玩计划所需的最低总花费。

提示:带虚线的词点一下有通俗解释。

输入描述

<p> 输入为 2 个数组: </p> <p> 售票价格数组为 costs,costs.length = 4,默认顺序为一日票、三日票、周票和月票。 </p> <p> 小王计划游玩日期数组为 days,1 ≤ days.length ≤ 365,1 ≤ days[i] ≤ 365,默认顺序为升序。 </p>

输出描述

完成游玩计划的最低消费。

示例

示例 1

输入

5 14 30 100
1 3 5 20 21 200 202 230

输出

40

说明:根据售票价格数组和游玩日期数组给出的信息,发现每次去玩的时候买一张一日票是最省钱的,所以小王会卖 8 张一日票,每张 5 元,最低花费是 40 元。

示例 2

输入

1 2 7 25
1 4 6 7 8

输出

4

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
双机位A-Wonderland 购票决策图解 第1天 第365天 1 3 5 20 21 200 1日票 1日票 1日票 3日票(覆盖20,21,22) 周票(覆盖200~206) 月票(覆盖第1~30天) 目标:用最少的钱覆盖所有游玩日 动态规划:dp[i] = min(dp[i-1]+cost[0], dp[j]+cost[k]) 其中j是i之前最近的不在票覆盖范围内的日期
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「Wonderland」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。