华为OD机试 - Wonderland游乐园 - 动态规划(Java 2024 D卷 200分)

news2024/11/27 23:44:03

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

Wonderland是小王居住地一家很受欢迎的游乐园。 Wonderland目前有4种售票方式,分别为一日票(1天)、三日票(3天)、周票(7天)和月票(30天)。

每种售票方式的价格将由一个数组给出,每种票据在票面时限内可以无限制的进行游玩。例如,小王在第10日买了一张三日票,小王可以在第10日、第11日和第12日进行无限制的游玩。

小王计划在接下来一年内多次游玩该游乐园。小王计划的游玩日期将由一个数组给出。 现在,请您根据给出的售票价格数组和小王计划游玩日期数组,返回完成游玩计划所需要的最低消费。

二、输入描述

输入为2个数组

售票价格数组为costs,costs.length=4,默认顺序为一日票、三日票、周票和月票。

小王计划游玩日期数组为days,1<=days.length<=365,1<=days[i]<=365,默认顺序为升序。

三、输出描述

完成游玩计划的最低消费

四、测试用例

测试用例1:

1、输入

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

2、输出

40

3、说明

第1天买一张一日票:5元。
第3天买一张一日票:5元。
第15天买一张三日票:14元(覆盖15, 20, 21三天)。
第200天买一张三日票:14元(覆盖200, 202三天)。

总消费为 5 + 5 + 14 + 14 + 5 = 40。

测试用例2:

1、输入

5 14 30 100
2 4 6 8 10 12

2、输出

30

五、解题思路

1、动态规划

动态规划(Dynamic Programming, DP)是一种通过将问题分解成更小的子问题来解决复杂问题的优化方法。

动态规划常见应用:

(1)背包问题:

给定一定容量的背包和一组物品,每个物品有一定重量和价值,求背包能装下的最大价值。

(2)最长公共子序列(LCS):

求两个字符串的最长公共子序列的长度。

(3)编辑距离:

求将一个字符串变为另一个字符串所需的最小编辑操作(插入、删除、替换)的数量。

(4)硬币找零:

给定不同面值的硬币和一个总金额,求凑成该金额的最小硬币数量。

(5)斐波那契数列:

通过记忆化来计算斐波那契数列的值。

动态规划的注意事项

(1)状态定义:

需要明确每个状态代表的含义。例如,本题中 dp[i] 表示从第1天到第i天的最低花费。

(2)状态转移方程:

需要根据问题描述,建立状态转移方程。例如,本题中 dp[i] 可以通过前几天的状态加上当前天的购票费用来计算。

(3)边界条件:

需要处理好边界条件,例如数组的初始值设置、边界条件的处理等。本题中,dp[0] 初始为0,表示没有游玩时的花费为0。

(4)空间复杂度优化:

有些情况下可以通过滚动数组等方法优化空间复杂度。例如,在计算斐波那契数列时,可以只使用两个变量来保存前两个状态,而不需要完整的数组。

(5)子问题的顺序:

需要按照正确的顺序来解决子问题,通常是从最简单的子问题开始,逐步解决更复杂的子问题。

2、为什么采用动态规划?

针对本题,我们采用动态规划的原因如下:

(1)最优子结构:

动态规划适用于具有最优子结构性质的问题,即问题的最优解可以由其子问题的最优解构造而来。

在本题中,从第1天到第i天的最低花费可以通过前i天的最低花费和当天的各种购票方案来计算。

(2)重叠子问题:

动态规划特别适用于存在重叠子问题的问题,即不同的子问题会重复出现。

在本题中,从第1天到第i天的最低花费会反复计算,因此我们可以用动态规划将这些中间结果存储起来,避免重复计算,提高效率。

(3)状态转移方程:

在动态规划中,我们通过状态转移方程来逐步求解问题的最优解。

在本题中,对于每一天,我们有四种购票选择(一天票、三天票、七天票和月票),我们可以通过状态转移方程来计算每种购票方案的最小花费,从而得到全局的最小花费。

3、具体步骤:

本题的目标是根据给定的游玩日期和票价,计算出完成游玩计划所需的最低花费。我们采用动态规划(Dynamic Programming, DP)的方法来解决这个问题。具体的解题思路如下:

  1. 定义状态:
    • 我们使用一个数组 dp,其中 dp[i] 表示从第1天到第i天的最低花费。
  2. 初始化:
    • 初始化 dp[0] = 0,表示没有游玩的花费为0。
  3. 状态转移:
    • 对于每一个游玩日,我们有四种购票选择:一日票、三日票、七日票和月票。
    • 根据前面的花费情况,计算在第i天购票的最小花费,并更新 dp[i]:
    • dp[i] = min(dp[i-1] + costs[0], dp[i-3] + costs[1], dp[i-7] + costs[2], dp[i-30] + costs[3])
    • 注意边界条件处理,如果 i 小于3、7或30天时,相应的前面的花费应为0。
  4. 计算最小花费:
    • 逐日计算游玩计划的最低花费,最终得到 dp[lastPlayDay],其中 lastPlayDay 是游玩日期数组的最后一个元素。

六、Java算法源码

public class OdTest02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取票价数组
        int[] ticketPrices = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 读取游玩日期数组
        int[] playDays = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        // 获取最后一个游玩日期,即最大游玩日期
        int lastPlayDay = playDays[playDays.length - 1];

        // dp数组表示到第i天为止的最小花费,初始值为0
        int[] minCostUpToDay = new int[lastPlayDay + 1];

        // 游玩日期索引
        int playDayIndex = 0;

        // 遍历从第1天到最后一个游玩日
        for (int day = 1; day <= lastPlayDay; day++) {

            if (day == playDays[playDayIndex]) {
                // 如果当前日期是游玩日,有四种购票选择

                // 选择买“一日票”
                int costOneDay = minCostUpToDay[day - 1] + ticketPrices[0];

                // 选择买“三日票”
                int costThreeDay = (day >= 3 ? minCostUpToDay[day - 3] : 0) + ticketPrices[1];

                // 选择买“七日票”
                int costSevenDay = (day >= 7 ? minCostUpToDay[day - 7] : 0) + ticketPrices[2];

                // 选择买“月票”
                int costThirtyDay = (day >= 30 ? minCostUpToDay[day - 30] : 0) + ticketPrices[3];

                // 取上述四种票价中的最小值
                minCostUpToDay[day] = Math.min(Math.min(costOneDay, costThreeDay), Math.min(costSevenDay, costThirtyDay));

                // 移动到下一个游玩日期
                playDayIndex++;
            } else {
                // 如果当前日期不是游玩日,则花费与前一天相同
                minCostUpToDay[day] = minCostUpToDay[day - 1];
            }
        }

        // 输出最后一个游玩日的最小花费
        System.out.println(minCostUpToDay[lastPlayDay]);
    }
}

七、效果展示

1、输入

5 14 30 100
1 2 3 4 5 6 7 8 9 10

2、输出

44

3、说明

以下是逐天计算的过程:

第1天:买一日票,dp[1] = 5
第2天:买一日票,dp[2] = 5 + 5 = 10
第3天:买一日票,dp[3] = 10 + 5 = 15,或买三日票,dp[3] = 14,取最小值14
第4天:买一日票,dp[4] = 14 + 5 = 19
第5天:买一日票,dp[5] = 19 + 5 = 24
第6天:买一日票,dp[6] = 24 + 5 = 29,或买三日票,dp[6] = 19 + 14 = 28
第7天:买一日票,dp[7] = 28 + 5 = 33,或买三日票,dp[7] = 24 + 14 = 29,或买周票,dp[7] = 30
第8天:买一日票,dp[8] = 29 + 5 = 34,或买三日票,dp[8] = 29 + 14 = 33
第9天:买一日票,dp[9] = 34 + 5 = 39,或买三日票,dp[9] = 33 + 14 = 38
第10天:买一日票,dp[10] = 39 + 5 = 44,或买三日票,dp[10] = 38 + 14 = 42

所以,最终最小花费为 44。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 D卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

答应我,在量化策略回测里,避开未来函数这4个坑

由于社群的原因&#xff0c;看过不少策略&#xff0c;今天就腆着脸唠唠&#xff0c;量化新手期经常碰到未来函数的4个坑&#xff0c;希望量化萌新们少掉点儿头发。新手向文章&#xff0c;大神请绕行~ 情景1:使用前复权价格数据。 由于股票会存在分红送股的情形&#xff0c;价格…

芋道源码yudao-cloud 二开笔记(Editor富文本本地图片上传报错问题)

&#xff1a; 于是找到富文本的组件代码Editor.vue&#xff0c;检查一下上传的接口地址和token有没有传&#xff0c;如下图&#xff1a; 都没有问题&#xff0c;但还是报错&#xff0c;所以试试自定义上传的方法&#xff1a; // 导入上传文件的接口 import * as FileApi from …

reese84分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

最近火爆的GraphRAG是什么?真的那么有用吗?

最近&#xff0c;微软提出的GraphRAG项目引起了广泛关注。那么&#xff0c;GraphRAG究竟是什么&#xff1f;它真的那么实用吗&#xff1f;本文将为您详细解读GraphRAG的概念及其应用。 什么是传统的RAG&#xff1f; &#x1f4da; 在深入了解GraphRAG之前&#xff0c;我们首先…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

Python 解决 ImportError: cannot import name ‘example’

Python 解决 ImportError: cannot import name ‘example’ 在Python编程的广阔天地中&#xff0c;ImportError: cannot import name example 是一个令人头疼但又常见的错误。当你试图从某个模块中导入一个不存在的名称时&#xff0c;这个错误就会悄然降临。本文将带你深入探索…

AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较

随着AI模型训练成本的上升&#xff0c;人们越来越关注推理硬件的成本&#xff0c;尤其是在需要低延迟响应的应用中。Transformer模型需要强大的硬件支持&#xff0c;例如200毫秒以下的响应时间。Artificial Analysis最近分析了AI模型性能和定价&#xff0c;特别指出AMD的“Anta…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

跟着动脑学院学习Android 开发基础

跟着动脑学院up主学习Android开发&#xff0c;记录学习笔记 2022 最新 Android 基础教程&#xff0c;从开发入门到项目实战&#xff0c;看它就够了&#xff0c;更新中_哔哩哔哩_bilibili &#xff08;弱弱地说一句&#xff0c;绝大部分内容都是up主为我们准备好的资料里摘抄下…

机器学习 | 评估原理——模型评估与交叉验证

Hi&#xff0c;大家好&#xff0c;我是半亩花海。学完分类算法原理的知识&#xff0c;我们进入评估相关知识的学习&#xff0c;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享模型评估与交叉验证相关评估原理。本章的基于前几节已建立的模型进行评估知识…

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…

LeetCode:相同的树(C语言)

1、问题概述&#xff1a;给2个二叉树的根节点p和q&#xff0c;如果2个树在结构和数值上都相同才为true&#xff0c;否则为false 2、示例 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;p [1,2], q […

做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?

hello,我是阿磊&#xff0c;一个20年的码农&#xff0c;6年前代码写不动了&#xff0c;转型专职做副业项目研究&#xff0c;为劳苦大众深度挖掘互联网副业项目&#xff0c;共同富裕。 现在做知识付费项目还能做吗&#xff1f; 互联网虚拟资源项目我一直在做&#xff0c;做了有…

AI绘画模型之:UNet、Imagen 与 DeepFloyd IF

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

spring boot(学习笔记第十五课)

spring boot(学习笔记第十五课) Spring boot的websocket(广播) 学习内容&#xff1a; Spring boot的websocket&#xff08;广播&#xff09; 1. Spring boot的websocket&#xff08;广播&#xff09; 回顾下web server的进化 第一代Web程序&#xff0c;使用整体页面刷新技术…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

一些问题 7/28

get post可以public吗 在Java Servlet中&#xff0c;doGet()和doPost()方法的访问修饰符通常是public&#xff0c;因为这些方法需要被Servlet容器&#xff08;如Tomcat&#xff09;调用。 如果将这些方法声明为private或protected&#xff0c;Servlet容器将无法访问它们&…

RocketMQ Server Windows安装

RocketMQ阿里开发 开源给apache 官网:RocketMQ 官方网站 | RocketMQ 下载后解压 配置环境变量 注意启动顺序 双击 注意 4.9.0这个版本必须 jdk 8 高了用不了 namesrv是注册中心的作用 broke是核心用于接收生产者消息 存储消息 发送给消费者消息 类似DubboZookeeper…

C++ 绘制画布标尺

目标 关键代码 CRulerDrawer::CRulerDrawer(QPainter& painter, QRect rect, int scalePercent): m_painter(painter), m_rect(rect), m_scalePercent(scalePercent) {m_palette qApp->palette();m_scaleUnitSize PixelRuler::Instance()->GetScaleUnitSize(); }vo…

【JS|第22期】深入理解跨域

日期&#xff1a;2024年7月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…