BZOJ 5004 開鎖魔法II 概率dp

2021-08-15 19:33:49 字數 1332 閱讀 6357

盒子之間的開啟關係 用圖的方式呈現 就是一片環

最終所有成功開啟 則每一顆環都成功開啟

所以求出每個環放k個點成功的概率

之後依次列舉每一顆環 及其內部選擇點數與在之前的環中選擇點數 再乘上對應概率

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef double db;

typedef long long ll;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}void print(int x)

const int n=310;

int last[n],ecnt;

struct edgee[n];

inline void add(int u,int v)

;last[u]=ecnt;}

int fa[n];

int find(int x)

bool book[n];

int dep[n],size[n];

int len;

void dfs(int u)

dep[v]=dep[u]+1;

dfs(v);

size[u]+=size[v]; }}

int st[n],num[n],top;

db p[n][n],f[n],g[n],tmp[n][n];

int main()

else if(k==n)

top=0;

for(i=1;i<=n;++i)

if(find(i)==i)

st[++top]=i;

memset(book,0,sizeof(book));

for(i=1;i<=top;++i)

dep[st[i]]=1,dfs(st[i]),num[i]=len;

db now;

for(i=1;i<=top;++i)

memset(f,0,sizeof(f));

f[0]=1;

int s,t(0);

for(i=1;i<=top;++i)

printf("%.9lf\n",f[k]);

} return 0;

}

bzoj 5004 開鎖魔法II

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

bzoj5004 開鎖魔法II dp

一日,崔克茜來到小馬鎮表演魔法。其中乙個節目是開鎖咒 舞台上有n 個盒子,每個盒子中有一把鑰匙,對於每個盒子而言有且僅有一把鑰匙能開啟它。初始時,崔克茜將會隨機地選擇k個盒子用魔法將它們開啟。崔克茜想知道最後 所有盒子都被開啟的概率,你能幫助她回答這個問題嗎?考慮鑰匙向盒子連邊,形成的圖一定為多個不...

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 ...