HDU 4870(概率DP,高斯消元)

2022-05-24 15:21:07 字數 1565 閱讀 4786

2015-04-24 23:55:19

題目:乙個人拿兩個號打比賽,初始rating為0,每次她都拿rating低的號來打,漲rating的概率為p,一次漲50,降rating的概率為1-p,一次降100,問讓某個號的rating漲到1000需要的期望比賽場數。

思路:2個號只是拿來迷糊人的,把50看成1的話,問題就轉化為漲1降2,目標rating20的問題了。仔細思考發現終態必定是19,20。這樣兩個號實際上可以單獨考慮,用dp[i]來算出從 i 漲到 20 需要的期望場數,最後答案就是 dp[0] + dp[0] - dp[19]。

得轉移方程:dp[i] = (dp[i+1]+1)*p + (dp[i-2]+1)*(1-p)

用高斯消元求解即可。注意精度!(我的eps開到1e-10才過,但是後來想想實際上不用判自由元!因為每個dp都是有解的)

(方法二:直接推公式,看了別人部落格才知道。。。。就不贅述了)

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mem(a,b) memset(a,b,sizeof(a))

#define rep(i,n) for(int i=0;i<(n);++i)

#define for(i,a,b) for(int i=(a);i<=(b);++i)

#define getmid(l,r) ((l) + ((r) - (l)) / 2)

#define mp(a,b) make_pair(a,b)

#define pb(a) push_back(a)typedef

long

long

ll;typedef pair

pii;

const

double eps = 1e-13

;const

int inf = (1

<< 30) - 1

;const

int maxn = 30

;double

p;double

g[maxn][maxn];

void

gauss()

這部分實際上在這題中並不需要出現,寫了反而被卡精度qaq

*/for(int j = 21; j >= col; --j) g[i][j] /=g[i][col];

for(int k = 0; k <= 20; ++k) if(k !=i)

}}int

main()

g[20][20] = 1.0

; gauss();

printf(

"%.10f\n

",g[0][21] * 2 - g[19][21

]); }

return0;

}

hdu4870 高斯消元

題意 乙個人打比賽 rating 有p的概率 為加50分 有1 p的概率為 x 100分 最大值為 1000 最小值為0 有兩個號 每次拿較小的號來提交 計算最後到達 1000分得期望場數是多少,對每個狀態建立乙個方程然後用高斯消元解決 include include include include...

HDU4870 Rating 高斯消元

有個人有兩個0分賬號,他可以打比賽,他每次用分低的那個賬號打比賽,有p的概率名列前茅,加50分 上限1000分 否則掉100分 下限0分 問有乙個賬號到1000分的期望。先壓縮一下狀態,把50 5050 看作1 11,把100 10010 0看作2 22,把1000 1000 1000 看作20 2...

HDU 2262(高斯消元,概率DP)

2015 04 13 22 49 30 思路 參考了愛神的部落格a的.也改善了下高斯的模板。首先給每個格仔編號,假設某個格仔 設為第 i 個 到終點的期望為ei,考慮第 i 格的所有可行後繼節點 可行節點的意思是這些後繼節點可以到達終點 記為en1,en2.enk,總共k個,可列方程 ei en1 ...