洛谷 OSU (期望DP)

2022-05-06 21:03:11 字數 1058 閱讀 4001

題目位址

設 \(f[i]\) 表示以 \(i\) 結尾的連續 \(1\) 區間的期望貢獻(\(x^1\)),\(g[i]\) 表示以 \(i\) 結尾的連續 \(1\) 區間的期望貢獻(\(x^2\)),則有:

\[f[i]=p_i(f[i-1]+1)

\]\[g[i]=p_i(g[i-1]+2f[i-1]+1)

\](因為 \((x+1)^2=x^2+2x+1\))

類似的,可以設 \(h[i]\) 表示以 \(i\) 結尾的連續 \(1\) 區間的期望貢獻(\(x^3\)),則有 \(h[i]=p_i(h[i-1]+3g[i-1]+3f[i-1]+1)\)(因為 \((x+1)^3=x^3+3x^2+3x+1\))。由於不方便統計答案(直接加上去會有一些 \("1"\) 重複計算貢獻),我們又可以根據期望的線性性質:

\[e((x+1)^3) = e(x^3)+e(3x^2+3x+1)

\]計算每個位置上 \(1\) 的對答案增加的期望貢獻。位置 \(i\) 上選 \("1"\) 對答案增加的期望貢獻是:\(p_i(3g[i-1]+3f[i-1]+1)\),所以最後的答案是:

\[\sum p_i(3g[i-1]+3f[i-1]+1)

\]時間複雜度 \(o(n)\)。

talk is cheap.show me the code.

#includeusing namespace std;

inline int read()

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

return x * f;

}const int n = 100007;

int n;

double p[n],f[n],g[n],h[n];

int main()

printf("%.1lf",ans);

return 0;}/*

3 0.5

0.5

0.56.0

*/

主要是期望的線性性質。注意想當然地加會重複計算貢獻(自己手推一下會發現),要計算每個位置增加的期望貢獻

洛谷1654 OSU (期望)

點此看題面 立方的期望顯然不等於期望的立方,這種東西自己舉幾個例子就知道了。考慮我們維護到第 i 個位置為止的答案為 ans i 連續長度期望為 a i 連續長度平方期望為 b i 連續長度立方期望為 c i 一次期望的長度轉移是顯然的 a i a i a 1 對於二次期望,考慮 x 1 2 x 2...

osu合集(期望dp)

easy 我們設 f i 表示到 i 的連續個數平方的期望。g i 表示到到 i 的連續個數的期望 在維護 f i 的同時維護一下 g i 就行了。轉移方程 g i p i times g f i p i times f 2 times g 1 1 p i times f 解釋一下第二個方程,長度有...

洛谷1654 BZOJ4318 OSU 期望

題目鏈結 題意 有乙個長度為n nn的序列,每個數字都是0 00或1 11,告訴你每個數是1 11的概率。其中長度為x xx的連續的一段1 11對答案的貢獻是x 3x 3 x3,求答案的期望。n 1 e5 n 1e5 n 1 e5,四捨五入保留一位小數。題解 我們考慮乙個dp。最簡單的dp是n 2n...