【学习笔记】状压dp

Rotate Columns

状压好题!!

d p [ i ] [ S ] dp[i][S] dp[i][S]表示考虑前 i i i列, S [ j ] = 1 S[j]=1 S[j]=1表示已经钦定了第 j j j行的最大值,已经钦定的最大值之和最大

复杂度 O ( n m 3 n ) O(nm3^n) O(nm3n)显然 t l e tle tle飞了。

那么按每一列的最大值排序,注意到只有前 n n n列会对答案产生贡献。

于是优化到 O ( n 2 3 n ) O(n^23^n) O(n23n)

但是枚举子集太慢了。考虑对于一种循环,往集合里面一个一个塞数,用临时数组存一下然后贡献到答案里。

复杂度 O ( n 3 2 n ) O(n^32^n) O(n32n)。可以通过。

tips:小心数据范围诈骗。

Bits And Pieces

仔细想一下发现是套路题

从高到低位处理答案,预处理一下 S S S超集的最大,次大位置即可

复杂度 O ( ( n + a ) log ⁡ a ) O((n+a)\log a) O((n+a)loga)

Sandy and Nuts

烦死了烦死了

d p [ S ] [ u ] dp[S][u] dp[S][u]表示以 u u u为根的方案数, S S S是一个二进制状态

转移为 d p [ S ] [ u ] = ∑ d p [ S ⊕ S 2 ] [ u ] × d p [ S 2 ] [ v ] dp[S][u]=\sum dp[S\oplus S2][u]\times dp[S2][v] dp[S][u]=dp[SS2][u]×dp[S2][v]

为了避免算重我们强制 S 2 S2 S2包含特殊点 p p p时才能转移

考虑限制条件。事实上我们只关心 L C A LCA LCA在子树内以及边在子树内的情况。

对于 L C A LCA LCA

1.1 1.1 1.1对于限制 ( a , b , c ) (a,b,c) (a,b,c),如果 c = u c=u c=u,但是 a , b ∈ S 2 a,b\in S2 a,bS2 那么 L C A ( a , b ) ≠ c LCA(a,b)\ne c LCA(a,b)=c
1.2 1.2 1.2对于限制 ( a , b , c ) (a,b,c) (a,b,c),如果 c ∈ S 2 c\in S2 cS2,但是 a ∉ S 2 a\notin S2 a/S2或者 b ∉ S 2 b\notin S2 b/S2那么 L C A ( a , b ) ≠ c LCA(a,b)\ne c LCA(a,b)=c

对于边:
1.1 1.1 1.1对于边 ( x , y ) (x,y) (x,y),如果 x ∈ S 2 x\in S2 xS2并且 y ∈ S − u y\in S-u ySu或者反之,那么 ( x , y ) (x,y) (x,y)不可能在树上
1.2 1.2 1.2如果 u u u i i i有边并且 i ∈ S 2 i\in S2 iS2 i i i的个数 ≥ 2 \ge 2 2,那么不可能有满足条件的树

事实上如果满足条件的 i i i的个数等于 1 1 1,那么转移时 S 2 S2 S2的根可以直接求出

复杂度 O ( n q 3 n ) O(nq3^n) O(nq3n)

事实上可以对 L C A LCA LCA预处理,复杂度 O ( n 3 n + 2 n q ) O(n3^n+2^nq) O(n3n+2nq)

Yet Another DAG Problem

我是傻逼

key observation : \text{key observation}: key observation:每个点权值为 [ 0 , n − 1 ] [0,n-1] [0,n1]

把拓扑序拉出来,然后不断对一段后缀 − 1 -1 1直到不能减为止,然后把后缀最小的那个提到前面来,不难证明每次提到前面来的值小于 n n n

然后枚举子集把一个集合的点全部设为某一权值来转移,复杂度 O ( n 3 n ) O(n3^n) O(n3n)显然 t l e tle tle飞了。

如果当前点在第 j j j轮加进去的话贡献是 j × v [ i ] j\times v[i] j×v[i]

那么我们将贡献提前计算,复杂度 O ( 3 n ) O(3^n) O(3n)

Circling Round Treasures

我是傻逼

对于炸弹可以看成价值为无穷小的宝藏。

对于每个宝藏引一条射线,如果和封闭路径边界有奇数个交点就证明在封闭路径围成的内部。

考虑状压记录每个宝藏交点个数的奇偶性,以及当前所处的位置,然后跑最短路即可。

然后射线和线段求交点那个地方比较复杂。射线的斜率取一个比较大的随机数,这样就不会穿过整点了。

Wise Men

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值