数数题(计数类 DP)做题记录
CF1657E Star MST
我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和。
完全图点数为 \(n\),边权 \(\in[1,k]\),\(1\le n,k\le 250\)。
发现所有和 \(1\) 相连的边边权之和等于 MST 的边权之和,即限制这张图的 MST 就是以 \(1\) 为中心的“星星”形状。
所以任意两个点之间的边权一定大于等于他们与 \(1\) 相连的边的边权的最大值。
那么设 \(dp(i,j)\) 表示连了 \(\le i\) 的边权,选择了除了 \(1\) 之外 \(j\) 个点的方案数。
那么枚举状态,将转移表示把边权为 \(i\) 边新加进去,可以得到转移方程:
总时间复杂度 \(\mathcal{O(n^3)}\)(假设 \(n,k\) 同阶)。
P8096 [USACO22JAN] Drought G
Farmer John 的 \(n(n\le 100)\) 头奶牛站成一排,每一个都有一个饥饿值 \(h_i\),Farmer John 可以每次选择相邻的两头奶牛使她们的饥饿值同时 \(-1\)。
Farmer John 想让他的所有奶牛都有相同的饥饿值,尽管他不知道每头奶牛具体的饥饿值,只知道她们每一头饥饿值的上限 \(H_i(H_i\le 1000)\),使得 \(h_i\le H_i\)。
请计算出所有满足 Farmer John 的要求的 \(n\) 元组 \([h_1,h_2,\cdots,h_n]\) 数量对 \(10^9+7\) 取模的结果。
假设最终都到达的饥饿值为 \(k\),设 \(dp_{i,j}\) 表示前 \(i-1\) 头牛都达到了要求,第 \(i\) 头牛的饥饿值为 \(j\) 的方案数。
那么因为需要让 \(i\) 牛也变成 \(k\),可以列出转移方程:
上面的方程可以用前缀和优化实现 \(O(1)\) 转移。
那么最终答案就是 \(dp_{n,k}\)。
由于我们发现如果 \(n\) 是偶数,可以通过 \(\dfrac{n}{2}\) 次操作使所有饥饿值 \(-1\),所以如果 \(n\) 为偶数只用枚举一个 \(k\) 即可。
[USACO22MAR] Pair Programming G
还是不会