-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathminimum-cost-path-with-teleportations.py
More file actions
66 lines (63 loc) · 2.36 KB
/
minimum-cost-path-with-teleportations.py
File metadata and controls
66 lines (63 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Time: O(k * (m * n + r))
# Space: O(m * n + r)
# dp, prefix sum
class Solution(object):
def minCost(self, grid, k):
"""
:type grid: List[List[int]]
:type k: int
:rtype: int
"""
m = len(grid)
n = len(grid[0])
dp = [[float("inf")]*n for _ in xrange(m)]
dp[-1][-1] = 0
mx = max(max(row) for row in grid)
prefix = [float("inf")]*(mx+1)
for i in xrange(k+1):
for r in reversed(xrange(m)):
for c in reversed(xrange(n)):
if r+1 < m:
if dp[r+1][c]+grid[r+1][c] < dp[r][c]:
dp[r][c] = dp[r+1][c]+grid[r+1][c]
if c+1 < n:
if dp[r][c+1]+grid[r][c+1] < dp[r][c]:
dp[r][c] = dp[r][c+1]+grid[r][c+1]
if prefix[grid[r][c]] < dp[r][c]:
dp[r][c] = prefix[grid[r][c]]
for r in xrange(m):
for c in xrange(n):
if dp[r][c] < prefix[grid[r][c]]:
prefix[grid[r][c]] = dp[r][c]
for i in xrange(mx):
if prefix[i] < prefix[i+1]:
prefix[i+1] = prefix[i]
return dp[0][0]
# Time: O(k * (m * n + r))
# Space: O(m * n + r)
# dp, prefix sum
class Solution2(object):
def minCost(self, grid, k):
"""
:type grid: List[List[int]]
:type k: int
:rtype: int
"""
dp = [[float("inf")]*len(grid[0]) for _ in xrange(len(grid))]
dp[-1][-1] = 0
mx = max(max(row) for row in grid)
prefix = [float("inf")]*(mx+1)
for i in xrange(k+1):
for r in reversed(xrange(len(grid))):
for c in reversed(xrange(len(grid[0]))):
if r+1 < len(grid):
dp[r][c] = min(dp[r][c], dp[r+1][c]+grid[r+1][c])
if c+1 < len(grid[0]):
dp[r][c] = min(dp[r][c], dp[r][c+1]+grid[r][c+1])
dp[r][c] = min(dp[r][c], prefix[grid[r][c]])
for r in xrange(len(grid)):
for c in xrange(len(grid[0])):
prefix[grid[r][c]] = min(prefix[grid[r][c]], dp[r][c])
for i in xrange(len(prefix)-1):
prefix[i+1] = min(prefix[i+1], prefix[i])
return dp[0][0]