bzoj 1415
簡單期望 + 記憶化搜尋。
發現聰聰每一步走向的地方是在可可的所在位置確定時是確定的,設$nxt_$表示聰聰在$x$,可可在$y$時聰聰下一步會走到**,我們先預處理出這個$nxt$。
為了預處理$nxt$,我們還需要先預處理乙個$d_$表示$x$到$y$的最短距離,因為所有邊的邊權相同,所以我們第一次廣搜到乙個點的時候就是到這個點的最短路。
假如$d_ == d_ + 1$,$dis(x, y) == 1$,那麼$z$就是$x$到$y$最短路上的乙個點,用它更新$nxt_$即可。
我們設$f_$ 表示聰聰在$x$,可可在$y$時抓到可可的期望步數,顯然有:
$f_ == 0$ $(x == y)$
$f_ == 1$ $(nxt_ == y)$ 或者 $(nxt_, y} == y)$
而根據期望的性質,可可的隨機行走可以表示成這個公式:
$f_ = \frac f_, y}, z}} + 1$ $z == y$或者$z$可由$y$一步走到。
記憶化搜尋實現。
時間複雜度$o(n^2)$。
code:
#include #includeview code#include
using
namespace
std;
typedef
double
db;const
int n = 1005
;const
int inf = 0x3f3f3f3f
;int
n, m, st, ed, d[n][n];
int tot = 0
, head[n], deg[n], nxt[n][n];
db f[n][n];
struct
edge e[n
<< 1
];inline
void add(int
from, int
to)
inline
void read(int &x)
inline
void chkmin(int &x, int
y)
queue
q;inline
void bfs(int fir, int *dis) }}
}db dfs(
int x, int
y) res +=dfs(nxt[nxt[x][y]][y], y);
return f[x][y]= res / (deg[y] + 1) + 1;}
intmain()
for(int i = 1; i <= n; i++) bfs(i, d[i]);
/*for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= n; j++)
printf("%d ", d[i][j]);
*/memset(nxt,
0x3f, sizeof
(nxt));
for(int x = 1; x <= n; x++)
}/*for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= n; j++)
printf("%d ", nxt[i][j]);
*/for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
f[i][j] = -1.0
;
dfs(st, ed);
printf(
"%.3f\n
", f[st][ed]);
return0;
}
Luogu3823 NOI2017 蚯蚓排隊
題面 luogu3823 題意 n nn只蚯蚓,每只蚯蚓有乙個 6 le 6 6的長度,初始時每只蚯蚓一支隊伍。給出m mm個操作。三種操作 將以i ii結尾的隊伍和以j jj開頭的隊伍合併,且i ii的隊伍在前。將i ii和i ii後面乙隻蚯蚓處斷開,分為兩支隊伍。定義以第x xx只蚯蚓開始的長度...
Luogu4770 NOI2018 你的名字
題面 luogu4770 題意 給定乙個串s ss。每次詢問給出乙個字串t tt,問t tt有多少個不同的子串使得其也不是s l r s l r s l r 的子串。s 5 1 05 s le 5 times 10 5 s 5 105,q 1 05 q le 10 5 q 105,t 10 6 su...
Luogu 2254 NOI2005 瑰麗華爾茲
簡單dp,設 f 表示第i個時間段,鋼琴處在 j,k 位置移動距離的最大值,那麼有轉移 f max f f max f 其中 j dx len leq a leq j 1 k dy len leq b leq k 1 len ed st 1 其實就是乙個滑動視窗,考慮到轉移順序,就是寫四遍單調佇列 ...