freedom.9
Senior Member
Chạy cái khoảng cách tính distance từ mỗi đỉnh tới theft O(n^4) chết ngắc, phải tối ưu lại bằng BFS lol
Mình tính ra chỉ tầm khoảng (n - k)^2*k^2 cho mỗi lần tính mà vẫn chết.
TLE đoạn tính distance, sửa lại qua tính BFS là ok
Mình tính ra chỉ tầm khoảng (n - k)^2*k^2 cho mỗi lần tính mà vẫn chết.
Python:
class Solution:
def maximumSafenessFactor(self, grid: List[List[int]]) -> int:
n = len(grid)
dist = [[float('inf')] * n for _ in range(n)]
queue = deque()
for i in range(n):
for j in range(n):
if grid[i][j] == 1:
queue.append((i, j))
dist[i][j] = 0
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
while queue:
r, c = queue.popleft()
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < n and dist[nr][nc] == float('inf'):
dist[nr][nc] = dist[r][c] + 1
queue.append((nr, nc))
def isGood(safeness):
if dist[0][0] < safeness or dist[n - 1][n - 1] < safeness:
return False
visited = set()
queue = deque([(0, 0)])
visited.add((0, 0))
while queue:
r, c = queue.popleft()
if r == n - 1 and c == n - 1:
return True
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and dist[nr][nc] >= safeness:
visited.add((nr, nc))
queue.append((nr, nc))
return False
left, right = 0, n
ans = 0
while left <= right:
mid = (left + right) // 2
if isGood(mid):
ans = mid
left = mid + 1
else:
right = mid - 1
return ans
Python:
class Solution:
def maximumSafenessFactor(self, grid: List[List[int]]) -> int:
n = len(grid)
thief = []
directions = [[0, -1], [0, 1], [1, 0], [-1, 0]]
dp = [[inf for _ in range(n)] for _ in range(n)]
if grid[0][0] == 1 or grid[n -1][n - 1] == 1:
return 0
for i in range(n):
for j in range(n):
if grid[i][j] == 1:
thief.append([i, j])
for i in range(n):
for j in range(n):
for row, column in thief:
dp[i][j] = min(dp[i][j], abs(row - i) + abs(column - j))
def good(row, column, target, seen):
if row == 0 and column == 0 and dp[row][column] < target:
return False
if row == n - 1 and column == n - 1:
return True
for dx, dy in directions:
nx, ny = dx + row, dy + column
if 0 <= nx < n and 0 <= ny < n and not (nx, ny) in seen and dp[nx][ny] >= target:
seen.add((nx, ny))
if good(nx, ny, target, seen):
return True
return False
left = 0
right = n
ans = 0
while left <= right:
mid = left + (right - left)//2
if good(0, 0, mid, set([0, 0])):
ans = mid
left = mid + 1
else:
right = mid - 1
return ans
Last edited: