1 条题解

  • 0
    @ 2026-4-3 2:11:18

    C. 选区划分 详细题解

    1. 问题理解

    • 有一个 22nn 列的网格,nn33 的倍数。
    • 每个格子是 A(阿尔瓦罗)或 J(何塞)。
    • 需要将网格划分成若干个连通33 格区块(选区)。
    • 每个选区中,如果至少有 22A,则该选区投票给阿尔瓦罗。
    • 目标:最大化阿尔瓦罗赢得的选区数量。

    2. 关键观察

    观察 1:只有 33 种基本形状

    由于网格只有 22 行,任何 33 格的连通块只能是以下几种形状:

    • 水平条:一行中的连续 33 格(占 11 行,33 列)
    • L 形22 行,22 列,形如:
      • 第一行 22 格,第二行 11
      • 第一行 11 格,第二行 22

    注意:2×22 \times 2 方块有 44 格,不能直接使用,但可以通过两个 L 形组合。

    观察 2:填充必须完整

    由于网格只有 22 行,如果一行中使用了水平条,另一行也必须对应地使用水平条,否则会留下无法填充的洞。


    3. 动态规划状态设计

    由于 nn 较大(105\le 10^5),我们需要线性 DP。

    定义 dp[i][j]dp[i][j] 表示处理完前 ii 列后,能获得的最大票数。其中 jj 表示当前列的填充状态:

    • j=0j = 0:前 ii完全填满(包括第 ii 列)
    • j=1j = 1:前 ii 列完全填满,且第 i+1i+1 列的第一行多了一个格子(即有一个 L 形伸到了下一列)
    • j=2j = 2:前 ii 列完全填满,且第 i+1i+1 列的第二行多了一个格子

    4. 转移方程

    4.1 从 dp[k][0]dp[k][0] 出发(当前列完全填满)

    我们可以放置以下形状:

    形状 1:两个水平条

    • 第一行:列 k+1,k+2,k+3k+1, k+2, k+3
    • 第二行:列 k+1,k+2,k+3k+1, k+2, k+3
    • 覆盖 33 列,新状态 dp[k+3][0]dp[k+3][0]
    • 票数增加 = 两个水平条中 A 的个数除以 22(每个选区需要至少 22A 才能赢)

    形状 2:L 形(第一行 22 格,第二行 11 格)

    • 第一行:列 k+1,k+2k+1, k+2
    • 第二行:列 k+1k+1
    • 覆盖 22 列,但有一个格子伸到下一列?等一下,这个形状是 2222 列:
      • 第一行:k+1,k+2k+1, k+2
      • 第二行:k+1k+1
    • 这会留下第 k+2k+2 列第二行空着?不对,需要仔细。

    根据标程,实际形状是:

    • L 形(第一行 22 格,第二行 11 格)覆盖:
      • 第一行:k+1,k+2k+1, k+2
      • 第二行:k+1k+1
    • 这占用了第 k+1k+1 列的两格,和第 k+2k+2 列的第一格。
    • 剩余状态:第 k+2k+2 列的第二行是空的,但第 k+1k+1 列已满。
    • 实际上,这会留下一个“突出”的格子,对应状态 dp[k+1][2]dp[k+1][2](第二行多一格)。

    所以:

    • 放置后,新状态 dp[k+1][1]dp[k+1][1](第一行多一格)或 dp[k+1][2]dp[k+1][2](第二行多一格)

    票数计算

    • 对于 L 形,33 个格子,票数 = 这 33 格中 A 的个数是否 2\ge 2?实际上标程用的是 /2 取整,因为每个选区最多 11 票,(A个数)/2 就是是否 2\ge 2(整数除法)。

    4.2 从 dp[k][1]dp[k][1] 出发(第一行多一格)

    此时,第 k+1k+1 列第一行已有一个格子(来自之前的 L 形),我们需要补全。

    形状 1:两个水平条(错位)

    • 第一行:列 k+2,k+3,k+4k+2, k+3, k+4
    • 第二行:列 k+1,k+2,k+3k+1, k+2, k+3
    • 这样正好填满第 k+1k+1 列的第二行,以及后续。
    • 新状态 dp[k+3][1]dp[k+3][1]

    形状 2:第四种 L 形(完成填充)

    • 可以放置一个 L 形,使得状态变为 dp[k+2][0]dp[k+2][0]

    4.3 从 dp[k][2]dp[k][2] 出发(第二行多一格)

    对称于 dp[k][1]dp[k][1],交换行即可。


    5. 转移公式总结

    dp[k][0]dp[k][0]

    • dp[k+3][0]dp[k+3][0]:加两个水平条
    • dp[k+1][1]dp[k+1][1]:加 L 形(第一行 22 格,第二行 11 格)
    • dp[k+1][2]dp[k+1][2]:加 L 形(第一行 11 格,第二行 22 格)

    dp[k][1]dp[k][1]

    • dp[k+3][1]dp[k+3][1]:加两个错位水平条
    • dp[k+2][0]dp[k+2][0]:加第四种 L 形

    dp[k][2]dp[k][2]

    • dp[k+3][2]dp[k+3][2]:加两个错位水平条
    • dp[k+2][0]dp[k+2][0]:加第三种 L 形

    6. 票数计算

    每个形状覆盖 33 个格子,票数 = 这 33 格中 A 的数量 2\ge 2?标程使用 /2 取整:

    • 如果 A 数量 = 0011/2 = 0(输)
    • 如果 A 数量 = 2233,`/2 = 1$(赢)

    所以票数 = (A个数) / 2(整数除法)。


    7. 初始化和答案

    • 初始化:dp[0][0]=0dp[0][0] = 0,其他为 -\infty
    • 最终答案:dp[n][0]dp[n][0](所有列完全填满)

    8. 时间复杂度

    • 每个测试用例 O(n)O(n)
    • n105\sum n \le 10^5,完全可行

    9. 示例验证

    以第一个测试用例为例:

    3
    AAA
    AJJ
    
    • 11 列:A, A
    • 22 列:A, J
    • 33 列:A, J

    最优划分:两个 L 形,每个都有 22 个 A,得 22 票。✅


    10. 总结

    核心思想:

    1. 只有 22 行,可能的 33 格形状有限
    2. 使用 DP 按列处理,状态表示当前列的填充情况
    3. 转移时根据形状计算新增票数
    4. 最终 dp[n][0]dp[n][0] 即为答案
    • 1

    信息

    ID
    6317
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者