bzoj5004 開鎖魔法II dp

2021-08-30 19:29:10 字數 1234 閱讀 4022

一日,崔克茜來到小馬鎮表演魔法。其中乙個節目是開鎖咒:舞台上有n

個盒子,每個盒子中有一把鑰匙,對於每個盒子而言有且僅有一把鑰匙能開啟它。

初始時,崔克茜將會隨機地選擇k個盒子用魔法將它們開啟。崔克茜想知道最後

所有盒子都被開啟的概率,你能幫助她回答這個問題嗎?

考慮鑰匙向盒子連邊,形成的圖一定為多個不相交的環,我們只需要乙個環至少選乙個就能開啟環內剩餘的盒子

注意到直接求不太好做,我們dp設f[i,j]為前i個環用了j個鑰匙都開啟了的方案數,我們用答案除總的方案數就可以了

這個轉移比較顯然,組合數直接用double不會有毛病

#include

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fill(x,t) memset(x,t,sizeof(x))

typedef

long

long ll;

const

int n=

505;

struct edge e[n*2]

;double c[n]

[n],f[n]

[n];

int ls[n]

,size[n]

,wjp,edcnt;

bool vis[n]

;void

add_edge

(int x,

int y)

; ls[x]

=edcnt;

}void

dfs(

int now)

}int

main

(void

)int t;

for(

scanf

("%d"

,&t)

;t--;)

rep(i,

1,n)if(

!vis[i]

)rep

(i,1

,std::

min(m,size[1]

))rep(i,

2,tot)

rep(j,

1,m)

}printf

("%.9lf\n"

,1.0

*f[tot]

[m]/c[n]

[m]);}

return0;

}

bzoj 5004 開鎖魔法II

給你n個點,每個點有且只有一條有向邊邊 你可以在上面選擇k個點,問你選到這k個點,沿著邊走,可以走完整個圖的概率是多少 很明顯,這個圖,最後會成為很多個不同的聯通塊 然後對於每乙個聯通塊,我們縮點之後,就會出現乙個樹,明顯地,樹的根是一定要選的 當然,樹的根有可能是乙個環 然而環裡面,你任意選擇乙個...

BZOJ 5004 開鎖魔法II 概率dp

盒子之間的開啟關係 用圖的方式呈現 就是一片環 最終所有成功開啟 則每一顆環都成功開啟 所以求出每個環放k個點成功的概率 之後依次列舉每一顆環 及其內部選擇點數與在之前的環中選擇點數 再乘上對應概率 include include include include include include in...

bzoj3038(線段樹開根)

法1,因為最多不會開根6次,所以開根,直接搞 include include include include includeusing namespace std typedef long long ll inline ll read int n struct aa a 100025 4 void ...