【5.2模拟赛】士兵值班 【DP,性质题】

启程漂泊的舟船之声
空无一物的黑夜底部
"清晨是不会来的"

题意

有一个军事基地被划分成 \(n\)\(m\) 列,共 \(n*m\) 个格子。
每个格子最多只能有 \(1\) 个士兵值班。

司令现在安排值班方案,方案必须同时满足如下的所有条件:
1、每一列最多只能有 \(1\) 个士兵值班。
2、对于第i行来说,前 \(L_i\) 个格子总共只能有1个士兵值班。
3、对于第i行来说,后 \(R_i\) 个格子总共只能有1个士兵值班。

解法

这类方格填数,然后带上一大堆约束的题,常见思路就是压缩状态...
稍微手摸一下,可以把行剖成三部分,左区间,中间的无约束区间,右区间,而且这三部分互不干扰。
不妨将每行拆成一个左区间,一个无约束区间,一个右区间。且我们只在乎有多少个左右区间没有被满足。

性质:

对于左区间,若端点 \(i\leq j\),则任何一个可以在 \(i\) 处站岗的士兵必然可以在 \(j\) 处站岗。
对于右区间,若端点 \(i\leq j\),则任何一个可以在 \(j\) 处站岗的士兵必然可以在 \(i\) 处站岗。
这个看起来是废话(?

约定

设左区间端点恰为 \(i\) 的行数为 \(CNTL_i\)
设右区间端点恰为 \(i\) 的行数为 \(CNTR_i\)
设中间区间包含 \(i\) 的行数为 \(CNTM_i\)

考虑排除无视左区间。不难想出一个这样的DP。定义 \(f_{i,j}\) 为目前枚举到第 \(i\) 列,此时还有 \(j\) 个左端点在 \(i\) 前的区间没有被满足。即 \(CNTL\) 全为0
则状态转移为
目前放在左区间和中间区间 \(f_{i+1,j+R_{i+1}} \gets \left( f_{i,j} * CNTM_{i+1} + f_{i+1,j+R_{i+1}}\right )\)
目前放在右区间 \(f_{i+1,j+R_{i+1}-1} \gets \left( f_{i,j} * (j+R_{i+1}) + f_{i+1,j+R_{i+1}-1}\right )\)

可是左区间的约束无法无视(? 怎么办?目前可以填写,未来就填不了了,着实有点辣手。。。

于是某道名叫 考试 的题在睡午觉的过程中就浮现出来了...启发着通过强令合法来便利转移...
于是令转移的过程中,左区间恒合法。

\(f_{i,j,k}\) 表示 目前枚举到第 \(i\) 列,还有 \(j\) 列未放小球,\(k\) 行的右区间没满足。
当前小球选择满足左区间:
\(f_{i+1,j+1-l_{i+1},k+r_{i+1}} \gets f_{i,j,k} \times P_{j+1}^{l_{i+1}} + f_{i+1,j+1-l_{i+1},k+r_{i+1}}\)
当前小球选择满足中间区间:
\(f_{i+1,j-l_{i+1},k+r_{i+1}} \gets f_{i,j,k} \times P_{j}^{l_{i+1}} \times CNTM_{i+1} + f_{i+1,j-l_{i+1},k+r_{i+1}}\)
当前小球选择满足右区间:
\(f_{i+1,j-l_{i+1},k+r_{i+1}-1} \gets f_{i,j,k} \times P_{j}^{l_{i+1}} \times (k+CNTR_{i+1}) + f_{i+1,j-l_{i+1},k+r_{i+1}-1}\)
最后答案即为 \(\sum_i f_{m,i,0}\)

感觉这类方格填数的题目挺板子的?
找个时间搜集一下罢

posted @ 2022-05-04 15:56  Hencecho  阅读(20)  评论(0编辑  收藏  举报