Leetcode 3651. Minimum Cost Path with Teleportations
- Leetcode 3651. Minimum Cost Path with Teleportations
- 1. 解题思路
- 2. 代码实现
- 题目链接:3651. Minimum Cost Path with Teleportations
1. 解题思路
这一题思路上就是一个动态规划的思路。
我们定义dp[i][j]
表示从坐标(i,j)(i,j)(i,j)开始走到终点所需要的最小cost,然后,我们首先可以没有什么难度的计算出如果没有传送的情况下的每一个位置上的dp[i][j]
的值。
然后,我们分别考察至多kkk次teleportation之后每个位置上的cost的变化,这个的话我们只需要考察在第k−1k-1k−1次跳跃之后进行下一次跳跃后dp
矩阵会产生的变化,这个的话我们只需要将所有的矩阵点按照其原本的值与当前的cost进行从小到大排列,然后每一个点的cost就都会变成其前序点当中的cost的最小值。
然后,我们只需要基于更新的cost值重新计算一遍整个dp
矩阵的内容即可。
2. 代码实现
给出python代码实现如下:
class Solution:def minCost(self, grid: List[List[int]], k: int) -> int:n, m = len(grid), len(grid[0])cost = [[0 for _ in range(m)] for _ in range(n)]for j in range(m-1, 0, -1):cost[-1][j-1] = cost[-1][j] + grid[-1][j]for i in range(n-1, 0, -1):cost[i-1][-1] = cost[i][-1] + grid[i][-1]for j in range(m-1, 0, -1):cost[i-1][j-1] = min(cost[i-1][j]+grid[i-1][j], cost[i][j-1]+grid[i][j-1])for _ in range(k):seen = set()points = sorted([(grid[i][j], cost[i][j], i, j) for i in range(n) for j in range(m)])min_cost = math.inffor _, _, i, j in points:min_cost = min(min_cost, cost[i][j])cost[i][j] = min_costfor j in range(m-1, 0, -1):cost[-1][j-1] = min(cost[-1][j-1], cost[-1][j] + grid[-1][j])for i in range(n-1, 0, -1):cost[i-1][-1] = min(cost[i-1][-1], cost[i][-1] + grid[i][-1])for j in range(m-1, 0, -1):cost[i-1][j-1] = min(cost[i-1][j-1], cost[i-1][j]+grid[i-1][j], cost[i][j-1]+grid[i][j-1])return cost[0][0]
提交代码评测得到:耗时4428ms,占用内存20.47MB。