1. 解题思路
这一题思路上就是一个动态规划的思路。
我们定义dp[i][j]表示从坐标
(
i
,
j
)
(i,j)
(i,j)开始走到终点所需要的最小cost,然后,我们首先可以没有什么难度的计算出如果没有传送的情况下的每一个位置上的dp[i][j]的值。
然后,我们分别考察至多
k
k
k次teleportation之后每个位置上的cost的变化,这个的话我们只需要考察在第
k
−
1
k-1
k−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.inf
for _, _, i, j in points:
min_cost = min(min_cost, cost[i][j])
cost[i][j] = min_cost
for 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。
297

被折叠的 条评论
为什么被折叠?



