题意简述
给定 \(H \times W\) 的网格图,如果一个字符是 #
,则不能走到该字符上;如果是 .
,则可以走到该字符上,但如果它周围 \(4\) 个格子中有 #
字符,则不能再继续行走了。
自由度是指从一个格子出发,能走到不同格子的数量(可以出发多次)。求出所有格子的最大自由度。
思路
考虑建图:每个格子的编号为 \((i-1) \times m+j\)。如果一个格子能走到另一个格子,则将这两个格子连边。
现在这是一个有向有环图。我们将该图进行缩点,得到一个有向无环图。新图中每个点的权值为该 SCC 中的结点个数。
设 \(dp_i\) 表示从第 \(i\) 个 SCC 出发能到达格子的数量。求 \(dp_i\) 时,如果使用普通的拓扑排序,则需要建反图,比较麻烦。我们可以直接采用记忆化搜索,代码好写且保证时间复杂度。
另外在缩点后新连边的时候,可能会连到重边,这对后面求 \(dp_i\) 是有影响的。因此我们可以用一个 set<pair<int,int>>
来去重。
最后将所有 \(dp_i\) 取最大值,即可得到答案。
标签:缩点,字符,格子,AtCoder,题解,abc351,dp From: https://www.cnblogs.com/lrxmg139/p/18164430