dfs+回溯 46/51 还是超时 almost
class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:
# bfs不同的起点?
ans = 0
m = len(grid)
n = len(grid[0])
def dfs(pos, sum):
nonlocal ans
nonlocal visit
x, y = pos
sum += grid[x][y]
if sum > ans:
#print(sum)
ans = sum
visit[x][y] = True
# record the visit
myVisit = copy.deepcopy(visit)
X = [-1, 0, 1, 0]
Y = [0, -1, 0 ,1]
for i in range(4):
nextX = x + X[i]
nextY = y + Y[i]
#print(nextX, nextY)
if 0 <= nextX < m and 0 <= nextY < n and grid[nextX][nextY] != 0 and visit[nextX][nextY] is False:
dfs([nextX, nextY], sum)
# 回溯
visit = copy.deepcopy(myVisit)
#sum = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 0:
continue
#sum += grid[i][j]
visit = [[False] * n for _ in range(m)]
dfs([i, j], 0)
#print(sum)
return ans
正确做法:不用visit
因为用了visit之后回溯的非常慢,要把dfs更改的visit全部去掉
这里采用原地修改的方法为0的方法封路,遍历完四个方向之后解除封锁
class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:
# bfs不同的起点?
ans = 0
m = len(grid)
n = len(grid[0])
def bfs(pos, sum):
nonlocal ans
nonlocal visit
x, y = pos
sum += grid[x][y]
if sum > ans:
#print(sum)
ans = sum
visit[x][y] = True
# record the visit
myVisit = copy.deepcopy(visit)
X = [-1, 0, 1, 0]
Y = [0, -1, 0 ,1]
for i in range(4):
nextX = x + X[i]
nextY = y + Y[i]
#print(nextX, nextY)
if 0 <= nextX < m and 0 <= nextY < n and grid[nextX][nextY] != 0 and visit[nextX][nextY] is False:
bfs([nextX, nextY], sum)
# 回溯
visit = copy.deepcopy(myVisit)
#sum = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 0:
continue
#sum += grid[i][j]
visit = [[False] * n for _ in range(m)]
bfs([i, j], 0)
#print(sum)
return ans
总结:
回溯不一定要更改visit数组
可以原地修改成封锁的路,后面dfs完上下左右再解封!