bzoj1415 noi2005 聰聰和可可 期望

2021-09-11 21:21:02 字數 1332 閱讀 3468

本來毫無思路,看到網上設了二維陣列表示期望後,覺得很妙。

設f[i][j]為聰聰在i,可可在j的聰聰吃到可可的時間期望。

dis[i][j]==1 ||==2 時,f[i][j]=1 ,i==j 時,f[i][j]=0;

由於聰聰能走2步,可可每次只能走一步,所以dis[i][j]一定是越來越小的。

我們可以先處理出g[i][j]表示此時聰聰應該往哪走。

最後就按照期望的定義求就行了。dis[i][j]大的由dis[u][v]小的得到,記憶化一下就行了。

如果有需要的話,可以求出整張圖中任意點對的f[i][j]值,我之前也準備這麼寫,後來發現可以但沒必要。

所以vectora本來是要先求出近的點對的值,再求遠的點對的值,就這樣dp,後來就沒用了。。。

#include#define maxl 1010

using namespace std;

int n,m,cnt,cat,mouse;;

double ans;

int ehead[maxl],du[maxl];

int dis[maxl][maxl],g[maxl][maxl];

struct path

;vector a[maxl];

struct ehead

e[maxl*2];

double f[maxl][maxl];

struct node

};priority_queue,greater> q;

bool in[maxl];

inline void add(int u,int v)

inline void prework()

}inline void dijstra(int st)

); int u,v;node d;

while(!q.empty())

while(dis[st][d.ind]!=d.l);

u=d.ind;in[u]=true;

for(int i=ehead[u];i;i=e[i].nxt));}

} }for(int v=1;v<=n;v++)

); }

}inline double solve(int cat,int mouse)

f[cat][mouse]=ret;

return ret;

}inline void mainwork()

} for(int i=1;i<=n;i++) g[i][i]=i;

ans=solve(cat,mouse);

}inline void print()

int main()

BZOJ1415 Noi2005 聰聰和可可

資料的第1行為兩個整數n和e,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。第2行包含兩個整數c和m,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。接下來e行,每行兩個整數,第i 2行的兩個整數ai和bi表示景點ai和景點bi之間有一條路。所有的路都是無向的,即 如果能從a走到...

BZOJ1415 Noi2005 聰聰和可可

portal 一張無向連通圖,貓和老鼠起始點分別位於a,b。每一步貓先行,老鼠每一步可以走連向當前點的任意一條邊,也可以不動,概率相同。貓每一步走向離老鼠最近的點,若該點有多個,選擇標號最小的乙個,若一步沒有到老鼠所在點,還可以再走一步。求貓捉到老鼠的期望步數。首先可以先預處理出陣列p x y 表示...

bzoj1415 Noi2005 聰聰和可可

傳送門 記憶化搜尋。用f i j 表示兩個人物在i和j時的期望值。然後列舉各種情況 1.重合 答案為0 2.差兩步之內 答案為1 3.差2步以上 走兩步後的f值 1 取乙個平均值就可以了。include include include include include include using na...