当前位置: 首页 > news >正文

Kimi LeetCode 3651. 带传送的最小路径成本 Python3实现

这是 LeetCode 3651「带传送的最小路径成本」的 Python3 实现。

题目概述

给定一个 `m × n` 的网格 `grid`,每个格子有一个成本值。从左上角 `(0,0)` 出发,目标是到达右下角 `(m-1,n-1)`。

移动规则:
- 普通移动:只能向右或向下移动,花费为目标格子的成本值
- 传送:最多使用 `k` 次。可以从任意格子传送到另一个值不大于当前格子值的格子,传送花费为 `0`

解题思路

核心思想是分层 DP:按使用传送次数 `0, 1, ..., k` 逐层计算最小成本。

1. 普通 DP(无传送):`dp[i][j]` 表示从 `(0,0)` 走到 `(i,j)` 的最小成本,只能向右或向下
2. 传送优化:使用传送后,可以从之前任意一个值 ≥ 当前格子值的格子免费跳过来。为了快速查询,维护一个后缀最小值数组 `suf_min_f[v]`,表示所有值 ≥ `v` 的格子中,使用当前次数传送后的最小成本
3. 逐层迭代:每多一次传送机会,重新计算一遍整个网格的 DP,同时利用上一层的后缀最小值来优化传送决策

Python3 代码

```python
from typing import List

class Solution:
def minCost(self, grid: List[List[int]], k: int) -> int:
m, n = len(grid), len(grid[0])

# 特判:如果可以直接传送到终点
if k > 0 and grid[0][0] >= grid[m - 1][n - 1]:
return 0

# 找到网格中的最大值,用于后缀最小值数组
mx = 0
for row in grid:
mx = max(mx, max(row))

INF = float('inf')
# suf_min_f[v] 表示所有值 >= v 的格子中,使用 t-1 次传送的最小成本
suf_min_f = [INF] * (mx + 2)
# f[j+1] 表示当前行处理到第 j 列时的最小成本(滚动数组优化)
f = [INF] * (n + 1)

for t in range(k + 1):
min_f = [INF] * (mx + 1) # min_f[v] 记录当前层中值为 v 的格子的最小成本
new_f = [INF] * (n + 1)

if t == 0:
new_f[1] = 0 # 起点成本为 0

for i in range(m):
for j in range(n):
x = grid[i][j]
# 方案1:从左边或上边走过来
standard_move = min(new_f[j], new_f[j + 1]) + x
if i == 0 and j == 0 and t == 0:
standard_move = 0

# 方案2:从之前某个值 >= x 的格子传送过来(花费为0)
# suf_min_f[x] 已经包含了所有可用传送来源的最小成本
new_f[j + 1] = min(standard_move, suf_min_f[x])

# 更新当前层中值为 x 的格子的最小成本
min_f[x] = min(min_f[x], new_f[j + 1])

f = new_f

# 为下一层准备后缀最小值数组
# new_suf[v] = min(所有值 >= v 的格子的最小成本)
new_suf = [INF] * (mx + 2)
for v in range(mx, -1, -1):
new_suf[v] = min(new_suf[v + 1], min_f[v])

# 如果后缀最小值不再变化,提前结束
if suf_min_f == new_suf:
break
suf_min_f = new_suf

return f[n]
```

复杂度分析

- 时间复杂度:`O(k × m × n + k × V)`,其中 `V` 是网格中的最大值。主要开销是 `k` 轮 DP 遍历网格,以及每轮构建后缀最小值数组
- 空间复杂度:`O(m × n)` 可以优化到 `O(n + V)`,使用滚动数组 `new_f` 仅需维护一行的 DP 值,加上后缀最小值数组 `O(V)`

关键点

- 后缀最小值优化:`suf_min_f[x]` 表示"从任意一个值 ≥ x 的格子传送过来的最小成本",这样传送决策从 `O(mn)` 降到了 `O(1)`
- 滚动数组:`new_f[j]` 和 `new_f[j+1]` 分别代表从左边和上边转移过来的状态,空间复杂度从 `O(mn)` 降到 `O(n)`
- 提前终止:如果某一轮的后缀最小值数组不再变化,说明增加传送次数已经无法优化结果,可以直接退出循环

参考来源:

http://www.jsqmd.com/news/1232661/

相关文章:

  • 零跑C10智能座舱与FSD减振技术深度解析
  • AI编程工具安全深度解析:从Claude Code风险到企业级防护实践
  • 家装除甲醛正规机构哪家好 2026年值得信赖的体验服务品质之选 - 工业推荐榜
  • Unity角色缩放功能实现:从按钮绑定到平滑动画与性能优化
  • 模型独立评估:从环境标准化到自动化流程的实战指南
  • 智能手机存储芯片涨价:原因、影响与应对策略
  • 2026泸州房屋渗漏水检测公司口碑榜TOP5推荐-正规防水补漏一站式维修:卫生间/厨房/阳台/屋顶/地下室/屋顶/天沟渗漏水精准测漏补漏上门 - 安佳防水
  • IDA Pro与BinDiff 6.0联调环境搭建及二进制差异分析实战指南
  • Ubuntu命令行操作基础与实用技巧
  • YOLO目标检测结果解析与优化实践
  • C/C++编译链接全流程解析:从源码到可执行文件的完整指南
  • C++指针与内存管理:从基础原理到智能指针实战应用
  • 使用pybind11将C++高性能模块封装为Python包实战指南
  • 2026年Java学习平台横评与选择指南
  • 核磁专用高纯液氦实力厂家2026口碑推荐,价格透明零套路避坑指南 - 工业推荐榜
  • CSS动画与JavaScript交互:实现运动会主题角色动画效果
  • 终极指南:3分钟让微信网页版重新可用,开源插件wechat-need-web完整教程
  • AI代理管理IDE:多代理系统开发工具的设计与实践
  • 深入解析SoC电源域管理:从概念到DRA7xP实战
  • 2026年 渝中区物流公司推荐榜单:高效配送/智能仓储服务首选,行业实力深度解析 - 甄选服务推荐
  • C++程序coredump分析与调试:从崩溃定位到性能优化实战
  • Xournal++:构建你的跨平台数字笔记工作流
  • C++高性能内存池实现:固定块与空闲链表设计详解
  • 港股医疗与科技板块异动股解析及交易策略
  • 供应链管理基础:从概念到数字化转型实践
  • C++日志库选型指南:spdlog与Quill性能、特性与场景深度对比
  • C++跨平台编程:掌握<cinttypes>解决整数类型可移植性问题
  • Linux系统管理必备:高效命令行操作与实用技巧
  • 2026沧州房屋渗漏水检测公司口碑榜TOP5推荐-正规防水补漏一站式维修:卫生间/厨房/阳台/屋顶/地下室/屋顶/天沟渗漏水精准测漏补漏上门 - 安佳防水
  • C/C++编程入门:从环境搭建到内存管理的核心概念与实践