BZOJ3270 博物館 矩陣求逆

2022-05-22 17:33:15 字數 2453 閱讀 9094

前置知識:

本題的正常做法見

這裡提供一種不正常的矩陣求逆方法。之所以說它不正常,是因為我自己都不能證明這個演算法的正確性,但是它是能過題的(

設狀態\((t,u,v)\)表示當前時刻為t,兩人分別處在位置u、v。設\(f[t][u][v]\)表示從初始狀態出發,能夠到達狀態\((t,u,v)\)的概率。下記\(q[u]=\frac\),\(link[u]\)表示u的相鄰點集合,有轉移方程如下:

\[f[t][u][v] = \begin f[t-1][u][v]\times p[u]p[v] \\ \sum\limits_f[t-1][i][v]\times q[i]p[v] \\ \sum\limits_f[t-1][u][j]\times p[u]q[j] \\ \sum\limits_f[t-1][i][j]\times q[i]q[j] \end

\]發現這個轉移可以用矩陣描述。

\[m \times \left[ \begin f[t-1][1][1] \\ f[t-1][1][2] \\ \vdots \\f[t-1][n][n] \end \right] = \left[ \begin f[t][1][1] \\ f[t][1][2] \\ \vdots \\f[t][n][n] \end \right]

\]其中轉移矩陣m,是乙個\(n^2 \times n^2\)的矩陣,可以通過上面的轉移方程計算出來。

我們想計算出\(f[u][v]=\sum_^f[t][u][v]\),因為在u點相遇的答案就是\(\frac\)。而

\[(e+m+m^2+…) \times \left[ \begin f[0][1][1] \\ f[0][1][2] \\ \vdots \\f[0][n][n] \end \right] = \left[ \begin f[1][1] \\ f[1][2] \\ \vdots \\f[n][n] \end \right]

\]顯然\(f[0][u][v] = [u=a]\times[v=b]\);另外,\(e+m+m^2+…\)又可以化成\(\frac=(e-m)^\)

這樣就做完了,總時間\(o(n^6)\)

不過,這個演算法有兩個bug:

無法證明\(e-m\)的行列式不等於0,因此\((e-m)^\)不一定存在

\(e+m+m^2…\)的收斂性無從證明,因此幾何級數公式不一定適用

#includeusing namespace std;

#define ld long double

#define rg register

#define in inline

const int sn = 400;

const int n = 20;

const ld eps = 1e-9;

in int sgn(ld x)

in int read()

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

return s * ww;

}int n,m,sn;

in int id(int i,int j)

struct mat

friend mat operator - (mat a,mat b)

friend mat operator * (mat a,mat b)

void swap(int i1,int i2)

void mul(int i,ld k)

void add(int i1,int i2,ld k)

}m,e;

mat inv(mat a)

ld x = 1.0 / a.d[j][j];

a.mul(j,x),b.mul(j,x);

for(rg int i = j + 1;i <= sn;i++)

} for(rg int j = sn;j >= 1;j--)

} return b;

}int head[n+5],deg[n+5],cnt;

struct edgee[2*sn+5];

in void addedge(int a,int b)

ld p[n+5],q[n+5];

int main()

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

for(rg int u = 1;u <= n;u++)

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

for(rg int ev = head[v];ev;ev = e[ev].next)

for(rg int eu = head[u];eu;eu = e[eu].next)

}} m = inv(e - m);

ld s = 0;

for(rg int i = 1;i <= n;i++)s += m.d[id(i,i)][id(a,b)];

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

return 0;

}

bzoj3270博物館 期望概率DP

題目 設計乙個狀態表示兩個人分別在兩個點的狀態,帶個標號num i j 據此得到狀態之間轉移的關係所構成的n元方程,高斯消元求解 要注意起點的概率要 1,而且開始時兩個人在兩個點是有區分的,所以不能 a,b 和 b,a 都加 用scanf會ce,所以改成了快讀和cin 調了一天的才找到錯誤竟然是把d...

BZOJ 3270 博物館 概率 高斯消元

source實力透露做法。似乎有這麼個式子 f i,j pi p j f i,j 1 pi di p j f x,j 1 pj dj p i f i,y 1 pi di1 pjdj f x,y x adj i,y adjj 然後還有f a,b 1答案為f i,i 開n n個變數的方程組高斯消元?時間...

bzoj3270 博物館 期望 高斯消元

傳送門本題的點數很少,只有20個 考慮用二元組 s u,v 表示甲在 u 點,乙在 v 點的狀態 那麼可以用 f s 表示狀態 s 出現的概率 不同的 f 之間的轉移就是通過邊 轉移有4種情況 對於 s u,v 來說,有以下四種轉移 轉移一,甲乙都選擇不動,此時從 s 轉移到 s 概率為 p u p...