1 条题解

  • 0
    @ 2026-5-16 23:30:15

    1950G - 随机播放歌曲 官方标程题解 + 完整 AC 代码

    (格式严格规范:公式、数字、变量全加 $\$n16n\le 16 状压DP 标准解法)

    一、题意回顾(最简版)

    给定 nn 首歌(n16n\le 16),每首歌有流派 gig_i作者 wiw_i

    要求选出最多的歌,可以排成一个序列,满足: 相邻两首歌 流派相同 或 作者相同

    答案 = nn - 最多保留歌数。


    二、标程核心思路

    1. 字符串归一化(坐标压缩)

    把字符串映射为数字,避免频繁比较字符串超时。

    2. 状压 DP 定义(官方标准)

    dp[mask][i]=true/falsedp[mask][i] = \text{true/false}
    • maskmask:二进制集合,表示选了哪些歌
    • ii:序列最后一首歌是 ii
    • 含义:能否以歌 ii 结尾,选出 maskmask 里的歌并排成合法序列

    3. 转移方程

    如果歌 jj 没选,且 ii 与歌 jj 合法相邻

    dp[mask(1j)][j]dp[mask][i]dp[mask | (1\ll j)][j] \gets dp[mask][i]

    4. 答案

    所有 dp[mask][i]=truedp[mask][i]=true 中,最多二进制 11 的数量。 最少删除数 = nmax_cntn - \text{max\_cnt}


    三、标程总结(3 条必背)

    1. n16n\le 16 → 状压DP
    2. dp[mask][i]dp[mask][i]:选 maskmask,以 ii 结尾是否合法
    3. 转移:能接就接,最后统计最大合法长度

    需要我给你逐行讲解代码生成对拍器吗?

    • 1

    信息

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