咕咕咕了好久的做题记录qwq

还是一本通上的一些题

死亡之树:给定一张 \(n\) 个点 \(m\) 条边的无向图,求有多少个本质不同的生成树恰好有 \(k\) 个叶子结点。 \(n\le 10, k\le m\le 45\)

看到 \(n\) 这么小,可以想到状压。记 \(f_{S,T}\) 表示已经加入树中的节点状态为 \(S\) ,叶子状态为 \(T\) 的方案数。枚举没有被加入树的节点会接在那个点下边,可以得到所有树的形态。
考虑如何去重。由于不同形态的树被重复计算的次数不同,所以不能在最后计算完后再去重,需要一直保证 \(f_{S,T}\) 没有重复。我们发现每一棵树最后加入的节点一定是一个叶子,所以可以通过叶子来区分。规定最后加入的叶子必须是节点编号最大(或者最小)的叶子,如果不满足则为非法转移,这样就能保证同一棵树只会被计算一次。复杂度 \(O(4^N+N^2*3^N)\)

矩阵填数:给定一个 \(h×w\) 的矩阵,矩阵的行编号从上到下依次为 \(1∼h\) ,列编号从左到右依次 \(1∼w\)。在这个矩阵中你需要在每个格子中填入 \(1∼m\) 中的某个数。
给这个矩阵填数的时候有一些限制,给定 \(n\) 个该矩阵的子矩阵,以及该子矩阵的最大值 \(v\),要求你所填的方案满足该子矩阵的最大值为 \(v\)
现在,你的任务是求出有多少种填数的方案满足 \(n\) 个限制。
两种方案是不一样的当且仅当两个方案至少存在一个格子上有不同的数。由于答案可能很大,你只需要输出答案 \(\mod1000000007\)

因为 \(n\) 很小,所以可以考虑状压DP。对于读入的矩形边界进行离散化,我们可以把大矩形切成 \((2n+1)^2\) 个小矩形,并且每个小矩形中的点的覆盖情况相同。
\(f[i][j][k]f[i][j][k]\) 表示到底第 \(i\) 行第 \(j\) 列的小矩形,状态为 \(k\) 的方案数。状态的二进制位表示的是第 \(i\) 个限制是否满足(是否已经填入 \(v\) )。
如果一个小矩形被多个限制矩形覆盖,那么该小矩形的v由限制矩形中最小的 \(v\) 决定。如果该小矩形一定填入了 \(v\) (方案数为\(v^2-(v-1)^2\)),那么所有限制等于小矩形的 \(v\) 的限制矩形都会被满足。

posted @ 2021-05-27 11:21  Van-Helsing  阅读(50)  评论(0)    收藏  举报