🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试
💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导
✨ 本系列打算持续跟新
春秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸
✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试
目前今年秋招的笔试已经全面上线OJ啦!!!
已经订阅专栏的小伙伴可以联系我解锁评测权限
OJ使用相关请戳:OJ使用相关
🍠 华子秋招笔试,来啦!!!
🍥 本次华子是DP专场,没有了之前的阅读理解+大模拟,还是比较
nice
的1️⃣ 基础
BFS
的拓展版,不难2️⃣
排序+动态规划
,LIS的多维拓展问题,但由于这里值域和 n n n 都比较小,可以直接暴力dp
3️⃣ 非常经典的线性DP了,本质是
区间调度
问题,这个知识点考了许多次,本题需要类似建图的思想来优化。
🪐 01.K小姐的管理计划
问题描述
在一个美丽的小区里,K小姐每天都要处理居民们产生的生活垃圾。为了确保垃圾能够及时处理,她需要将这些垃圾运输到最近的垃圾回收站。小区和垃圾回收站都分布在一个 m m m 行 n n n 列的区域矩阵中,居民区、垃圾回收站、空白区域和障碍物分别用不同的数字表示。K小姐希望计算出将所有小区的垃圾送到垃圾回收站的最小距离总和。
在这个区域矩阵中:
- 0 0 0 表示垃圾回收站
- 1 1 1 表示小区
- 2 2 2 表示空白区域
- − 1 -1 −1 表示障碍区域(不可通行)
如果区域内没有小区或者垃圾回收站,则返回 0 0 0。无法到达垃圾回收站的小区也不计入距离和。
输入格式
第一行包含两个数字 m m m 和 n n n,表示区域矩阵的行数和列数,中间用空格分隔, m m m 和 n n n 的范围均为 [ 1 , 300 ] [1, 300] [1,300]。
接下来的 m m m 行表示一个 m × n m \times n m×n 的区域矩阵数组,每行的元素间以空格分隔,其中元素取值仅为 − 1 -1 −1(障碍区域)、 0 0 0(垃圾处理站)、 1 1 1(小区)、 2 2 2(空白区域)。
输出格式
输出一个整数,表示所计算的最小距离和。
样例输入
4 4
1 2 -1 1
2 0 2 0
2 2 -1 2
1 2 1 1
样例输出
11
数据范围
- 区域矩阵的行数和列数均在 [ 1 , 300 ] [1, 300] [1,300] 范围内。
题解
基础的BFS
需要在一个矩阵中找到所有垃圾回收站的位置,然后从这些位置开始,向周围的区域扩展,寻找可以到达的小区。
-
BFS:从所有垃圾回收站出发,将它们的初始距离设为 0 0 0,然后逐层向外扩展,直到所有可达的小区都被访问到。
-
处理障碍物:在扩展过程中,需要注意障碍物( − 1 -1 −1)的存在,确保不会访问到这些区域。
-
计算距离和:对于每个小区,记录到垃圾回收站的最短距离,并将这些距离累加,得到最终的结果。
-
时间复杂度:由于 BFS 会遍历整个矩阵,时间复杂度为 O ( m × n ) O(m \times n) O(m×n),对于最大 300 × 300 300 \times 300 300×300 的矩阵来说是可以接受的。
参考代码
🔒订阅专栏解锁参考代码以及评测功能 → \to → 🧷华为春秋招笔试
🎁 02.LYA的礼物塔
问题描述
LYA是一位热爱艺术的设计师。圣诞节前夕,她收到了许多来自朋友的礼物盒。这些礼物盒大小各不相同,LYA突发奇想,想要用这些盒子搭建一座"礼物塔"。
她的构想是这样的:每个盒子都可以用长、宽、高三个数字来描述。在搭建过程中,上面的盒子在长、宽、高三个维度上都必须严格小于下面的盒子。LYA希望能够搭建出最高的礼物塔,塔的高度等于所有使用的盒子高度之和。
现在,LYA需要你的帮助来计算出她能搭建的最高礼物塔的高度。
输入格式
第一行包含一个正整数 N N N,表示礼物盒的数量。
接下来的 N N N 行,每行包含三个正整数 L i L_i Li、 W i W_i Wi 和 H i H_i Hi,分别表示第 i i i 个礼物盒的长、宽和高。
输出格式
输出一个整数,表示LYA能搭建的最高礼物塔的高度。
样例输入
4
1 1 1
2 3 4
3 6 7
4 5 6
样例输出
12
样例解释
LYA可以选择3个盒子来搭建礼物塔:(1,1,1)、(2,3,4)和(3,6,7)。这样搭建的礼物塔高度为1+4+7=12,是所有可能方案中最高的。
数据范围
- 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1≤N≤1000
- 1 ≤ L i , W i , H i ≤ 10 1 \leq L_i, W_i, H_i \leq 10 1≤Li,Wi,Hi≤10
题解
这道题目本质上是一个动态规划问题,类似于最长递增子序列(LIS)的变种。
我们需要在三个维度上都满足严格递增的条件,同时最大化高度和。
解题思路如下:
-
首先,可以对所有礼物盒按照任意一个维度(比如长度)进行排序。这样可以保证至少一个维度是递增的。
-
定义
dp[i]
表示以第 i 个盒子为底的最大高度和。 -
对于每个盒子 i,需要检查在它之前的所有盒子 j。如果盒子 j 在所有三个维度上都严格小于盒子 i,那么可以考虑将盒子 i 放在盒子 j 上面。
-
状态转移方程为:
d p [ i ] = m a x ( d p [ i ] , d p [ j ] + h e i g h t [ i ] ) dp[i] = max(dp[i], dp[j] + height[i]) dp[i]=max(dp[i],dp[j]+height[i]),其中 j 是满足条件的所有盒子。 -
最后,
dp
数组中的最大值就是我们能搭建的最高礼物塔的高度。
时间复杂度分析:排序需要 O ( N log N ) O(N \log N) O(NlogN),动态规划过程需要 O ( N 2 ) O(N^2) O(N2),因此总的时间复杂度是 O ( N 2 ) O(N^2) O(N2)。对于 N ≤ 1000 N \leq 1000 N≤1000 的数据范围,这个复杂度是可以接受的。
参考代码
🔒订阅专栏解锁参考代码以及评测功能 → \to → 🧷华为春秋招笔试
🎶 03.LYA的音乐节策划
问题描述
LYA是一位著名的音乐节策划人。她正在为一个线性音乐节场地制定演出计划。这个场地由 N N N 个连续的舞台组成,从左到右编号为 1 到 N N N。
LYA收到了 M M M 个乐队的演出申请,每个申请都包含三个信息:起始舞台编号、结束舞台编号和预期收益。如果接受某个乐队的申请,那么从起始到结束的所有舞台都将被该乐队占用,其他乐队就不能再使用这些舞台。
LYA的目标是在保证不同乐队演出不冲突的前提下,制定一个能够使总收益最大化的演出计划。请你帮助LYA计算出这个最大收益。
输入格式
第一行包含一个正整数 N N N,表示舞台的数量。
第二行包含一个正整数 M M M,表示收到的演出申请数量。
接下来的 M M M 行,每行包含三个整数 K 1 K_1 K1、 K 2 K_2 K2 和 R R R,分别表示某个乐队申请的起始舞台编号、结束舞台编号和预期收益。
输出格式
输出一个整数,表示能够获得的最大总收益。
样例输入1
5
2
1 5 4
2 4 8
样例输出1
8
样例输入2
5
2
1 5 4
2 4 1
样例输出2
4
样例输入3
20
6
1 6 1
3 10 2
10 12 3
11 12 2
12 15 2
13 18 1
样例输出3
5
样例解释
对于样例1,LYA选择了第二个申请(2-4舞台,收益8),因为它能带来更高的收益。
对于样例2,LYA选择了第一个申请(1-5舞台,收益4),因为它覆盖了所有舞台并带来更高的收益。
对于样例3,LYA可以选择以下申请组合:
- 3-10舞台,收益2
- 11-12舞台,收益2
- 13-18舞台,收益1
总收益为2+2+1=5。
数据范围
- 1 ≤ N ≤ 10000 1 \leq N \leq 10000 1≤N≤10000
- 1 ≤ M ≤ 100000 1 \leq M \leq 100000 1≤M≤100000
- 1 ≤ K 1 < K 2 ≤ N 1 \leq K_1 < K_2 \leq N 1≤K1<K2≤N
- 1 ≤ R ≤ 100 1 \leq R \leq 100 1≤R≤100
题解
本质上是一个区间调度问题,可以用动态规划来解决。
首先,需要理解问题的核心:在不冲突的情况下,选择能够带来最大收益的演出组合。
考虑到每个演出都有起始和结束的舞台,可以将问题看作是在一条数轴上选择不重叠的区间,使得这些区间的价值和最大。
我们采用记忆化搜索的方式来实现该题
状态定义: 可以定义 d p [ i ] dp[i] dp[i] 为考虑第 i ∼ n i \sim n i∼n 个舞台时能获得的最大收益。
对于每个舞台$ i$,我们有两种选择:
- 不接受任何在此舞台开始的演出申请,那么最大收益就是 d p [ i + 1 ] dp[i + 1] dp[i+1]
- 接受某个在此舞台开始的演出申请,那么最大收益就是 该演出的收益 + dp[该演出结束舞台的下一个舞台]
这里数据范围比较大,对于每个区间可以连一条 k 1 → k 2 k1 \to k2 k1→k2 的边
因此,状态转移方程可以表示为:
d
p
[
k
1
]
=
m
a
x
(
d
p
[
k
1
+
1
]
,
m
a
x
(
r
+
d
p
[
k
2
+
1
]
)
)
dp[k1] = max(dp[k1 + 1], max(r + dp[k2+1] ))
dp[k1]=max(dp[k1+1],max(r+dp[k2+1]))
参考代码
🔒订阅专栏解锁参考代码以及评测功能 → \to → 🧷华为春秋招笔试