題目位址
設 \(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...