python刷题-dfs回朔经典习题(全局变量,bool类型加减运算)

最多1601. 最多可达成的换楼请求数目

心得:这道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同理,不再累述
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值