1 条题解
-
0
C. 选区划分 详细题解
1. 问题理解
- 有一个 行 列的网格, 是 的倍数。
- 每个格子是
A(阿尔瓦罗)或J(何塞)。 - 需要将网格划分成若干个连通的 格区块(选区)。
- 每个选区中,如果至少有 个
A,则该选区投票给阿尔瓦罗。 - 目标:最大化阿尔瓦罗赢得的选区数量。
2. 关键观察
观察 1:只有 种基本形状
由于网格只有 行,任何 格的连通块只能是以下几种形状:
- 水平条:一行中的连续 格(占 行, 列)
- L 形: 行, 列,形如:
- 第一行 格,第二行 格
- 第一行 格,第二行 格

注意: 方块有 格,不能直接使用,但可以通过两个 L 形组合。
观察 2:填充必须完整
由于网格只有 行,如果一行中使用了水平条,另一行也必须对应地使用水平条,否则会留下无法填充的洞。
3. 动态规划状态设计
由于 较大(),我们需要线性 DP。
定义 表示处理完前 列后,能获得的最大票数。其中 表示当前列的填充状态:
- :前 列完全填满(包括第 列)
- :前 列完全填满,且第 列的第一行多了一个格子(即有一个 L 形伸到了下一列)
- :前 列完全填满,且第 列的第二行多了一个格子
4. 转移方程
4.1 从 出发(当前列完全填满)
我们可以放置以下形状:
形状 1:两个水平条
- 第一行:列
- 第二行:列
- 覆盖 列,新状态
- 票数增加 = 两个水平条中
A的个数除以 (每个选区需要至少 个A才能赢)
形状 2:L 形(第一行 格,第二行 格)
- 第一行:列
- 第二行:列
- 覆盖 列,但有一个格子伸到下一列?等一下,这个形状是 行 列:
- 第一行:
- 第二行:
- 这会留下第 列第二行空着?不对,需要仔细。
根据标程,实际形状是:
- L 形(第一行 格,第二行 格)覆盖:
- 第一行:
- 第二行:
- 这占用了第 列的两格,和第 列的第一格。
- 剩余状态:第 列的第二行是空的,但第 列已满。
- 实际上,这会留下一个“突出”的格子,对应状态 (第二行多一格)。
所以:
- 放置后,新状态 (第一行多一格)或 (第二行多一格)
票数计算:
- 对于 L 形, 个格子,票数 = 这 格中
A的个数是否 ?实际上标程用的是/2取整,因为每个选区最多 票,(A个数)/2就是是否 (整数除法)。
4.2 从 出发(第一行多一格)
此时,第 列第一行已有一个格子(来自之前的 L 形),我们需要补全。
形状 1:两个水平条(错位)
- 第一行:列
- 第二行:列
- 这样正好填满第 列的第二行,以及后续。
- 新状态
形状 2:第四种 L 形(完成填充)
- 可以放置一个 L 形,使得状态变为
4.3 从 出发(第二行多一格)
对称于 ,交换行即可。
5. 转移公式总结
从 :
- 到 :加两个水平条
- 到 :加 L 形(第一行 格,第二行 格)
- 到 :加 L 形(第一行 格,第二行 格)
从 :
- 到 :加两个错位水平条
- 到 :加第四种 L 形
从 :
- 到 :加两个错位水平条
- 到 :加第三种 L 形
6. 票数计算
每个形状覆盖 个格子,票数 = 这 格中
A的数量 ?标程使用/2取整:- 如果
A数量 = 或 ,/2 = 0(输) - 如果
A数量 = 或 ,`/2 = 1$(赢)
所以票数 =
(A个数) / 2(整数除法)。
7. 初始化和答案
- 初始化:,其他为
- 最终答案:(所有列完全填满)
8. 时间复杂度
- 每个测试用例
- ,完全可行
9. 示例验证
以第一个测试用例为例:
3 AAA AJJ- 第 列:A, A
- 第 列:A, J
- 第 列:A, J
最优划分:两个 L 形,每个都有 个 A,得 票。✅
10. 总结
核心思想:
- 只有 行,可能的 格形状有限
- 使用 DP 按列处理,状态表示当前列的填充情况
- 转移时根据形状计算新增票数
- 最终 即为答案
- 1
信息
- ID
- 6317
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者