心得:这道dfs题是对所有情况遍历然后取满足情况的解,而我当时之所以死磕这题半天没磕出来,是因为一直想去控制搜索的方向,在遍历的过程中去给遍历限制条件。这其实也就对应着解dfs题的两种思路,一种是从整体出发“全扫描”最后去筛选结果,一种则是在遍历的时候有选择性的去遍历(像下面的解数独和N皇后问题都是这种思路), 而这道题如果也用这种思路去想的话,虽然可以找到符合题意的特解,就很难去找所有情况中的最优解(因为找到特解后不好控制让他重新回朔遍历找最优解),所以找特解的思路(上述第二种)适合用于迷宫型的问题,而上述第一种思路适合求所有情况中的特定情况(需最后比较)
目前为止对dfs的心得看法,如有错误,纯属正常。
官方解:
class Solution:
def maximumRequests(self, n: int, requests: List[List[int]]) -> int:
delta = [0] * n
ans, cnt, zero = 0, 0, n
def dfs(pos: int) -> None:
nonlocal ans, cnt, zero
if pos == len(requests):
if zero == n:
ans = max(ans, cnt)
return
# 不选 requests[pos]
dfs(pos + 1)
# 这里相当于两条路,在遍历到每一个位置的时候都可以选择选或者不选,这样就可以对应所有情况
# 选 requests[pos]
z = zero
cnt += 1
x, y = requests[pos]
zero -= delta[x] == 0 # 如果出发前该楼的相对人员走动为0,则总0数zero减一
delta[x] -= 1 # X楼相对人员减一
zero += delta[x] == 0 # 如果减一后正好为0,那么zero加一,这个和上面的操作是并行的
zero -= delta[y] == 0 # 对y同理,不再累述