bzoj 1415 概率dp和bfs預處理

2021-09-06 11:31:32 字數 2114 閱讀 5650

感覺挺經典的一道題目。 先用 bfs 預處理下一步走到的位置。因為每一步走法都是固定的,所以可以用dp的方法來做。

time limit: 10 sec  

memory limit: 162 mb

submit: 467  

solved: 276 [

submit][

status]

資料的第1行為兩個整數n和e,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。 第2行包含兩個整數c和m,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。 接下來e行,每行兩個整數,第i+2行的兩個整數ai和bi表示景點ai和景點bi之間有一條路。 所有的路都是無向的,即:如果能從a走到b,就可以從b走到a。 輸入保證任何兩個景點之間不會有多於一條路直接相連,且聰聰和可可之間必有路直接或間接的相連。

輸出1個實數,四捨五入保留三位小數,表示平均多少個時間單位後聰聰會把可可吃掉。

【輸入樣例1】

4 31 4

1 22 3

3 4【輸入樣例2】

9 99 3

1 22 3

3 44 5

3 64 6

4 77 8

8 9【輸出樣例1】

1.500

【輸出樣例2】

2.167

【樣例說明1】

開始時,聰聰和可可分別在景點1和景點4。

第乙個時刻,聰聰先走,她向更靠近可可(景點4)的景點走動,走到景點2,然後走到景點3;假定忽略走路所花時間。

可可後走,有兩種可能:

第一種是走到景點3,這樣聰聰和可可到達同乙個景點,可可被吃掉,步數為1,概率為 。

第二種是停在景點4,不被吃掉。概率為 。

到第二個時刻,聰聰向更靠近可可(景點4)的景點走動,只需要走一步即和可可在同一景點。因此這種情況下聰聰會在兩步吃掉可可。

所以平均的步數是1* +2* =1.5步。

對於所有的資料,1≤n,e≤1000。

對於50%的資料,1≤n≤50。

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3fffffff

#define n 1010

struct

node

edge[

2*n];

intcnt,pre[n];

intn,m;

intsx,ex;

intd[n];

double

dp[n][n];

intdis[n];

intnext[n][n];

queue

que[2

];int

mark[n];

void add_edge(int u,int

v)void bfs(int s)//

計算從s到其他點的下一步

for(int p=pre[s];p!=-1;p=edge[p].next) //

找到這乙個圈的點

dp[s][s]=0

; next[s][s]=s;

dis[s]=0

; mark[s]=1

;

int num=1

;

while(que[a].size()!=0

)

dis[v]=num;

que[a].push(v);}}

}}void dfs(int s,int

t) dfs(s,t);

tmp+=dp[ s ][t];

dp[ts][t]=tmp/(double)(d[t]+1)+1;}

intmain()

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

///dfs(sx,ex);

printf(

"%.3lf\n

",dp[sx][ex]);

return0;

}

BZOJ 1415 聰聰和可可 期望DP

我們可以用n次bfs預處理出 to陣列,to i j 表示聰聰從i點到j點第一步會走哪個點。那麼對於聰聰在i點,可可在j點,聰聰先走,定義dp i j 表示步數期望。那麼顯然有dp i j sigma dp p w dp p j dee j 1 1.其中p表示to to i j j w表示j點鄰接的...

bzoj1415 聰聰和可可

對於任意一對位置x,y我們可以找到聰聰的行走方案。這個可以bfs跑 然後我們用f x,y 表示聰聰在x,可可在y抓住的期望時間,於是轉移方程是 if x y f x y 0,if x走兩步能到y f x y 1,else f x y sigma f x nxtpos y nxtpos 1 d y 1...

數學期望 BZOJ 1415

description 題解 既然是平均情況,顯然就是求數學期望。我們會發現,每乙個時刻貓鼠之間的最短路徑一定是減小了,所以不會出現轉圈的情況,所以可以用記憶化搜尋,用f x y 表示貓在節點x,鼠在節點y,貓鼠相遇的期望值。題目中最終要的就是要知道貓的下一步會走到 可以列舉每個點,然後bfs刷最短...