-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathminimum-xor-path-in-a-grid.py
More file actions
42 lines (39 loc) · 1.33 KB
/
minimum-xor-path-in-a-grid.py
File metadata and controls
42 lines (39 loc) · 1.33 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
# Time: O(m * n * r), r = max(x for row in grid for x in row)
# Space: O(n * r)
# dp
class Solution(object):
def minCost(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
mx = max(x for row in grid for x in row)
l = 1<<mx.bit_length()
dp = [[False]*l for _ in xrange(len(grid[0]))]
dp[0][0] = True
for i in xrange(len(grid)):
new_dp = [[False]*l for _ in xrange(len(grid[0]))]
for j in xrange(len(grid[0])):
for k in xrange(l):
if dp[j][k] or (j-1 >= 0 and new_dp[j-1][k]):
new_dp[j][k^grid[i][j]] = True
dp = new_dp
return next(i for i in xrange(l) if dp[-1][i])
# Time: O(m * n * r), r = max(x for row in grid for x in row)
# Space: O(n * r)
# dp
class Solution2(object):
def minCost(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
dp = [set() for _ in xrange(len(grid[0]))]
dp[0].add(0)
for i in xrange(len(grid)):
new_dp = [set() for _ in xrange(len(grid[0]))]
for j in xrange(len(grid[0])):
for k in dp[j]|(new_dp[j-1] if j-1 >= 0 else set()):
new_dp[j].add(k^grid[i][j])
dp = new_dp
return min(dp[-1])