最近状压写少了看到这题第一反应是拓扑排序?
数据特征居然没看出来……
发现 n≤20,状压可以承受,所以设 fS,i 表示选择的集合是 S,其中有 i 对矛盾的排列数。
转移显然,了解状压套路的很容易想到。
但是有一个问题:转移时新产生的矛盾数要怎么做?
暴力的话,复杂度会炸。
考虑再利用状压,令 backi 表示本来应该排在 i 后面的数的集合。
转移时,新产生的矛盾数就是 |S⋂backi|。
统计 1 的个数可以预处理,但是我偷懒用了黑科技 __builtin_popcount
。
代码:
1 |
|