xsy1201 隨機遊走 高斯消元

2022-05-03 19:12:11 字數 1546 閱讀 1979

題目大意:你有乙個$n*m$的網格(有邊界),你從$(1,1)$開始隨機遊走,求走到$(n,m)$的期望步數。

資料範圍:$n≤10$,$m≤1000$。

我們令 $f[i][j]$表示從$(1,1)$隨機遊走到$(i,j)$的期望步數。不難推出:

如果$(i,j)$與邊界不想鄰,則有 $

f[i][j]=\frac(f[i-1][j]+f[i+1][j]+f[i][j-1]+f[i][j+1])+1$

如果$(i,j)$與邊界相鄰,但不在四個角,則把式子中的$\frac$改為$\frac$,並且將括號中的四個項刪掉乙個。

如果$(i,j)$在非起點的三個角上,則式子也顯然。

顯然這是乙個$nm$元一次方程,我們可以考慮用高斯消元在$o(n^3m^3)$的時間內完成求解,這樣子可以拿到$50$分的好成績。

我們令$x_$來表示$f[i][j]$。

那麼式子就變成了$x_i=\frac(x_+x_+x_+x_)+1$

然後我們會發現,第$i$條式子只有$[i-m,i+m]$是有值的。

根據高斯消元的特徵,第i條式子中包含$x_$的項值會被消掉,那麼實際上存在項的部分為$x_$。

我們又發現,式子中包含$x_i$的,只可能第$i-m$條式子至第$i+m$條式子。

那麼,我們在高斯消元時,並不需要把對所有式子進行處理,只需要處理第$i$條式子的後$m$條式子的第$i$項至第$i+m$項即可。

時間複雜度降低至$o(nm^3)$,你可以得到$80$分的好成績。

考慮到$m$很大,依然無法求解,考慮到$n$很小,我們將$n$和$m$進行$swap$,然後再去求解即可。

時間複雜度降低至$o(n^3m)$。可以得到$100$分的好成績。

1 #include2

#define m 10005

3#define ok(x,y) (1<=(x)&&(x)<=n&&1<=(y)&&(y)<=m)

4#define ok2(x,y) (ok(x,y)&&(!(x==1&&y==1)))

5#define d double

6using

namespace

std;

78 d *a[m];int

n,m;

910 d get(int i,int

j)18

19void newhh(int

x)30

31int

main()

34if(m>n) swap(n,m);

35for(int i=2;i<=m+2;i++) newhh(i);

36for(int i=2;i)

43delete

a[i];

44if(i+m+1

<=n*m) newhh(i+m+1

);45

}46 d ans=a[n*m][n*m+1]/a[n*m][n*m];

47delete a[n*m];

48 printf("

%.0lf\n

",ans);49}

5051

intmain()

BZOJ 3143 遊走 高斯消元

中文題目。f v 表示小z在圖上游走時,在v點走的次數 這樣就可以根據圖上的鏈結關係 構造出n個方程在求解既可 include include include include using namespace std const int maxn 500 5 const double eps 1e 4...

BZOJ 3143 遊走(高斯消元)

題意 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編號,使得小...

BZOJ 3143 遊走(高斯消元)

題意 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編號,使得小...