BZOJ3640 JC的小蘋果(高斯消元)

2022-05-14 13:41:53 字數 1146 閱讀 3199

點此看題面

設\(f_\)表示在體力值為\(k\)時走到\(i\)的概率,顯然有轉移方程:

\[f_=\sum_^f_\times \frac}

\]其中\(w_\)表示\(i,j\)之間的邊數,注意此題有重邊有自環。

看起來這樣就完事了,但\(a_i\)可能等於\(0\),也就是說我們不能簡單地分層\(dp\),因為在\(k\)相同的狀態之間也可能存在轉移。

這種時候就要套路地想到高斯消元,把這個轉移式看作乙個方程。

然而,如果直接暴力這麼去做顯然會\(t\)飛,因此要考慮優化。

考慮我們總共要做\(hp\)次高斯消元,但實際上每次高斯消元的係數都是相同的,區別只在於等號右邊的值。

因此我們可以在一開始先做一遍高斯消元,預處理出\(p_\)表示第\(j\)個式子等號右邊的值對第\(i\)個式子等號右邊的值的貢獻係數。

那麼接下來每次求解就變成\(o(n^2)\)了。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 150

#define m 5000

#define hp 10000

#define db double

#define eps 1e-12

#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)

using namespace std;

int n,m,hp,a[n+5],d[n+5],w[n+5][n+5];db f[hp+5][n+5];

namespace gauss//高斯消元

i void init()//初始化

//從下往上消得只剩對角線

} i void solve()//快速求解 }

int main()

return printf("%.8lf\n",t),0;//輸出答案

}

BZOJ3640 JC的小蘋果

建分層圖,有怪獸的點連後邊的層,每層之間是有拓撲序的所以可以一層一層高斯消元,然後我們發現每一層的方程組係數是一樣的只有常數不一樣,而常數項不影響消元過程,所以我們可以預處理消元的過程,這樣每次只需要消常數項就是n 2的,總複雜度就是hp n 2 這個 有重邊和自環,非常的蛋疼 include in...

BZOJ 3640 JC的小蘋果

題鏈 題解 期望dp,高斯消元 設dp i h 在i位置且血量為h這個狀態的期望經過次數。因為每當到達n點就停止遊戲,所以到達終點的概率就是dp n 1 dp n 2 dp n hp 可以按血量把dp分成若干個層次,我們希望這樣分層次後就可以把問題轉變為dag上的dp,可是存在傷害值為0的點,所以我...

BZOJ 3640 JC的小蘋果

我們考慮列出期望方程組,dp i j 表示在第 i 個點血量為 j 的時候到達 n 點的概率,所有的 dp n j 都是1,所有 j 0 都是0 答案是 dp 1 hp dp u j sum fracdp v j a v 我們發現這個方程在j不同的時候,只有常數項發生改變,剩下的係數不變 於是我們把...