Problem – 1929E – Codeforces

  • 无意看一眼标签是 \(dp\) 就一直朝树形状压 \(dp\) 的方向想了一年,发现不是树形 \(dp\)

  • \(dp_S\) 为完成集合 \(S\) 内的限制所需要的最少边数

  • 把每一对顶点的路径上每条边的值都状压,表示添加这条边可以实现的限制有哪些,记为 \(b_i\)

  • 因此有:

  • \[dp_S = min\{ dp_{S-b_i} + 1 \} \]

  • 但是还没有结束,因为直接这么做是 \(O(nk + 2^kn)\)

  • 这里需要一个重要结论:不同种类的 \(b_i\) 只有 \(O(k)\)

  • 考虑把一个 \(L\) 型的限制对拆成两个 \(I\) 型的,种类数一定不会减少

  • 而对于每一个加入的 \(L\) 性,显然最多增加两种类型

  • 因此最终种类数是 \(O(k)\)

  • 因此我们只需要把 \(b_i\) 去重即可做到 \(O(nk + 2^kk)\)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。