Solution

cookiebus 2023-04-08 8:29:36 35 返回题目

因为一行中如果断开的话就不算在同一行了,所以我们可以一行一行来考虑。

这样的话每层都会截出来一个最大的矩形,这有点向一个树形结构,可以用笛卡尔树

这里提一下,对于2312131这样的棋盘

三个1本来应该是同等级别的,但是在树上却有父子关系,因为它们之间的高的差为0

f[i][j]表示以为代表的区域内放个棋的方案数,sz[u]表示以u为根的子树大小

显然,对于节点u,其矩阵的长为sz[u],宽为h[u]-h[fa[u]]

1.png

所以我们先跑一个树上背包,合并所有子树的情况,再单独讨论该节点的区域内的放置情况。 假设一共放个棋,在该区域内放个棋则方案数为

本来矩阵的长为sz[u],但是要在子节点的范围内先放上j-k个棋,占用了j-k列,故还有sz[u]-j+k列能用来放

{{ vote && vote.total.up }}