1. 程式人生 > >luogu P1654 OSU! 概率dp

luogu P1654 OSU! 概率dp

傳送門

基礎dp還是想了好久....

維護連續區間長度的期望 還是三次方

考慮一次方非常好維護 問題就是期望長度的和 

記錄一下末端1個數的期望就行

有p[i]的概率繼承 有(1-p[i]) 的概率中斷

那麼三次方是一樣的

f[],g[],h[]分別維護1,2,3次下的末端期望長度

然後就可以轉移

注意h[]同時維護最終答案

Time cost : 35min

Code:

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4
#include<cstdio> 5 #include<cmath> 6 using namespace std; 7 #define N 100005 8 9 int n; 10 double p[N],f[N],g[N],h[N]; 11 12 int main() 13 { 14 scanf("%d",&n); 15 for (int i=1;i<=n;++i) scanf("%lf",&p[i]); 16 for (int i=1;i<=n;++i) 17 { 18 g[i]=p[i]*(g[i-1
]+1); 19 h[i]=p[i]*(h[i-1]+2*g[i-1]+1); 20 f[i]=p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(1-p[i])*f[i-1]; 21 } 22 printf("%.1lf\n",f[n]); 23 }
View Code