洛谷 6789 寒妖王 狀壓dp

2021-10-23 17:46:50 字數 2987 閱讀 8125

給乙個 n

nn 個點 m

mm 條邊的簡單無向圖,邊有邊權。定義乙個邊集是好的,當且僅當將這些邊和與這些邊相連的點取出來形成的圖沒有兩個或以上處在同乙個連通塊的不同的環。同時定義乙個邊集的權值為邊集中所有邊的邊權之和。

每條邊有 50

%50\%

50% 的概率消失,問圖中權值最大的好邊集的權值的期望。

n ≤15

,m≤60

n\le 15,m\le 60

n≤15,m

≤60

實際上就是問最大生成環套樹森林的期望。考慮按邊權從大到小加邊,一條邊有貢獻,當且僅當其兩個端點位於的連通塊是一棵樹,或位於不同的連通塊,且至少有乙個連通塊無環。

令 f i,

v,gi

,v

f_,g_

fi,v​,

gi,v

​ 表示考慮前 i

ii 條邊中端點與 v

vv 交集非空的那些,滿足 v

vv 是乙個極大的連通圖/樹的方案。加入一條邊進行轉移時,列舉包含這條邊兩個端點的集合 v

vv,再列舉兩個端點分別位於的連通塊 s,t

s,ts,

t,那麼

f i,

v=2f

i−1,

v+∑s

∩t=∅

,s∪t

=vfi

−1,s

∗fi−

1,

tf_=2f_+\sum_f_*f_

fi,v​=

2fi−

1,v​

+s∩t

=∅,s

∪t=v

∑​fi

−1,s

​∗fi

−1,t

​ g i,

v=gi

−1,v

+∑s∩

t=∅,

s∪t=

vgi−

1,s∗

gi−1

,t

g_=g_+\sum_g_*g_

gi,v​=

gi−1

,v​+

s∩t=

∅,s∪

t=v∑

​gi−

1,s​

∗gi−

1,t​

統計第 i

ii 條邊的貢獻時,考慮補記轉化,求第 i

ii 條邊不能做貢獻的方案。也就是 i

ii 所在連通塊存在環,或 i

ii 連線的兩個連通塊均存在環。注意到 v

vv 中存在環的方案等於 fi−

1,v−

gi−1

,v

f_-g_

fi−1,v

​−gi

−1,v

​,答案等於

∑ v(

fi−1

,v−g

i−1,

v+∑s

∩t=∅

,s∪t

=v(f

i−1,

s−gi

−1,s

)∗(f

i−1,

t−gi

−1,t

))

\sum_v\big(f_-g_+\sum_(f_-g_)*(f_-g_)\big)

v∑​(fi

−1,v

​−gi

−1,v

​+s∩

t=∅,

s∪t=

v∑​(

fi−1

,s​−

gi−1

,s​)

∗(fi

−1,t

​−gi

−1,t

​))

在算期望時,發現 v

vv 的方案數會少乘個 2

s2^s

2s,其中 s

ss 表示前 i

ii 條邊中,有多少條滿足兩個端點都不位於 v

vv 中。再維護乙個 s

vs_v

sv​ 表示有多少條邊的兩個端點均位於 v

vv 中即可。

實現的時候 f,g

f,gf,

g 可以滾動。時間複雜度為 o(m

3n

)o(m3^n)

o(m3n)

,有 1

9\frac

91​ 的常數。

#include

using

namespace std;

typedef

long

long ll;

const

int n =20;

const

int m =65;

const

int k =(1

<<15)

+5;const

int mod =

998244353

;int n, m, bin[n]

, f[k]

, g[k]

, num[k]

, inv[m]

;struct edgee[m]

;bool

cmp(edge a, edge b)

intmain()

(w -

=(ll)s * inv[i - num[

(bin[n]-1

)^ v]

]% mod)

%= mod;

}(ans +

=(ll)w * e[i]

.w % mod)

%= mod;

for(

int j = bin[n]-1

; j >=

0; j--)if

(!(j & x)&&!

(j & y))}

}printf

("%d\n"

,(ans + mod)

% mod)

;return0;

}

洛谷2704 狀壓dp

思路 這個狀壓確實挺強。第i行的不僅僅和i 1行有關係,還和i 2行有關係。一般的思路好像解決不了問題,咋搞?我們定義乙個陣列 dp 105 1 10 1 10 dp i t1 t2 i表示的是當前行,t1表示的是當前行的狀態,t2表示的是i 1行的狀態。假設t3表示的是i 2行的狀態,列舉i 2行...

洛谷狀壓DP做題記錄

題面確實是狀壓的入門題 用dp i j 表示以i結尾,狀態為j時的方案數,如下 includeusing namespace std const int maxn 1e6 7 const int n 20 int n,k ints maxn long long dp n maxn long long...

狀壓dp 洛谷P2622

狀壓dp 洛谷p2622 現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果...