蓝桥杯算法python
时间: 2025-05-08 12:09:46 浏览: 25
### 蓝桥杯 Python 算法题及解答
#### 题目一:最长滑雪道(记忆化搜索)
此题目涉及动态规划与记忆化搜索的概念。给定一个二维数组 `heights` 表示山的高度分布,求从任意一点出发能够滑到的最大长度路径。滑雪条件为当前高度大于下一位置高度。
以下是基于记忆化搜索的解决方案:
```python
def longest_ski_path(heights):
from functools import lru_cache
rows, cols = len(heights), len(heights[0])
@lru_cache(None)
def dfs(r, c):
max_len = 1
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols and heights[nr][nc] < heights[r][c]:
max_len = max(max_len, 1 + dfs(nr, nc))
return max_len
result = 0
for i in range(rows):
for j in range(cols):
result = max(result, dfs(i, j))
return result
# 测试样例
heights = [
[9, 8, 7],
[6, 5, 4],
[3, 2, 1]
]
print(longest_ski_path(heights)) # 输出应为 9
```
上述代码通过递归加缓存的方式实现记忆化搜索[^1]。
---
#### 题目二:最大矩形面积
该问题要求在一个由字符组成的矩阵中找到全为特定字符构成的最大矩形区域并返回其面积。例如,在一面墙上找一块空白区域用于涂鸦。
下面是解决方法之一:
```python
def maximal_rectangle(matrix):
if not matrix or not matrix[0]:
return 0
m, n = len(matrix), len(matrix[0])
height = [0] * (n + 1) # 多余的一位是为了处理栈中的边界情况
max_area = 0
for row in matrix:
for i in range(n):
height[i] = height[i] + 1 if row[i] == '1' else 0
stack = [-1]
for i in range(n + 1): # 将最后一位作为哨兵触发计算
while height[i] < height[stack[-1]]:
h = height[stack.pop()]
w = i - stack[-1] - 1
max_area = max(max_area, h * w)
stack.append(i)
return max_area
# 测试样例
matrix = [
["1", "0", "1", "0", "0"],
["1", "0", "1", "1", "1"],
["1", "1", "1", "1", "1"],
["1", "0", "0", "1", "0"]
]
print(maximal_rectangle(matrix)) # 输出应为 6
```
这段代码利用单调栈的思想来高效解决问题[^2]。
---
#### 题目三:最小公倍数最大化
已知正整数 $ N $ ,从中选取三个不同的数使得它们的最小公倍数尽可能大。分析发现最优策略是从连续的几个较大数值中挑选组合。
提供如下实现方案:
```python
def largest_lcm(N):
if N % 2 == 1:
return N * (N - 1) * (N - 2)
elif N % 3 != 0:
return N * (N - 1) * (N - 3)
else:
return (N - 1) * (N - 2) * (N - 3)
# 测试样例
print(largest_lcm(9)) # 输出应为 504
```
这里采用了分情况讨论的方法得出结论[^3]。
---
阅读全文
相关推荐


















