本來毫無思路,看到網上設了二維陣列表示期望後,覺得很妙。
設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...