shortest
先求出这张 DAG 的拓扑序。考虑删掉一个节点后从
chess
考虑网络流的行列建图模型,在交点处连边。但我们发现有障碍的隔开的两段是不会影响的,所以我们把所有连续的段单独拎出来建点。发现一个段里选第
但是每次询问跑一遍费用流复杂度肯定是不对的,所以考虑从小到达枚举
tower
有一个暴力的思路是
实际上由隔板法可以求出答案为
考虑 DP,如果按位置顺序依次加入每个塔的话,是需要状压前面选了哪些塔的,这个复杂度显然不对。所以我们换一种思路,按高度从大到小的顺序加入塔。这看似还需要记录之前加入的塔的相对顺序,实际上是不用的。我们只需要记
- 如果产生了
0 个空位,那么这个塔对k 没有贡献,转移为f(i+1,k,j-1)\gets j\cdot f(i,j,k) ; - 如果产生了
1 个空位,那么这个塔对k 会有一次自身高度的贡献,而且这个空位有在左边和右边两种情况,因此转移为f(i+1,k+(n-i),j)\gets 2j\cdot f(i,j,k) ; - 如果产生了
2 个空位,那么这个塔对k 会有两次自身高度的贡献,因此转移为f(i+1,k+2(n-i),j+1)\gets j\cdot f(i,j,k) 。
最后统一计算即可。