期望dp小結

2021-08-10 03:06:47 字數 2032 閱讀 6843

前言:期望dp狀態的定義是較為顯然的,但對於狀態的轉移往往需要一些公式的推導。關鍵的幾點是狀態之間的互通性,和狀態轉移的花費,以及轉移的概率

解決期望dp的幾個技巧如下:e[

x+y]

=e[x

]+e[

y]我們所求的期望可以化為多個步驟的期望累和

相關題目:j,l

在目標確定的情況下,可以得知在目標到達目標的期望值為0,然後根據期望的線性性質怎麼又是線性性質 得到狀態轉移方程:

dp[i]+=(dp[j]+cost)*p cost是轉移的花費 p是概率 有時要除以(1-轉移到自己的概率,但這是又不能單純地+cost)所以要結合具體情況考慮

相關題目:a,c,d,e

e[a]=a1*p1+a2*p2+…+an*pn;

a1,a2…an為各種方案(情況)的花費(權值),p1,p2…pn為對應方案(情況)的發生概率 所以在最終方案確定且較少時,只用計算出發生的概率,在最後再乘上權值求累和就好了

相關題目:g,j

題目選講:

b:參見komachi dalao部落格

g: 看到2

20 就應該知道可以用狀壓,

但如果單純地算每個數被計算出的概率,那麼複雜度為n∗

2n∗t

,穩定吃tle

題目的另外乙個特別之處在於:只有|,&,^三個運算子,他們在運算時是不會發生進製的,所以可以直接記錄每一位數出現0或1的概率,然後在最後直接概率乘上權值就好了

參見**:

#include

double dp[205][25][2],p[205];

int a[205];

int b[205][25];

char op[205][3];

int main()

}else

if(op[i][0]=='|')

else dp[i][j][1]+=(dp[i-1][j][1]+dp[i-1][j][0])*p;

}else

if(op[i][0]=='^')

else

}dp[i][j][1]+=dp[i-1][j][1]*p[i];

dp[i][j][0]+=dp[i-1][j][0]*p[i];}}

double ans=0;

for(int j=0;j<=20;j++)

ans+=dp[n][j][1]*(

1}return

0;}

j:

可以知道,對於m道題的每n道題,會對應不同的n個人

那麼可以直接對這n個人對應n道題進行狀壓dp,複雜度t∗

m∗2n

根據期望的線性性質,我們可以把每個階段的期望值都加起來,然後就可以得到答案

#include

double dp[15][1200];

double p[15][1005];

template

_ max(_ x,_ y)

template

_ min(_ x,_ y)}}

double sum=0;

for(int i=0;i<=tta;i++)

if(dp[len][i]>sum)sum=dp[len][i];

ans+=sum;

}printf("case #%d: %.5f\n",++t,ans);

}return

0;}

l:

仍是根據期望的線性性質,求被覆蓋點的期望,可以化簡為求所有點被覆蓋的期望的累和。然後利用容斥,算出點不被覆蓋的概率p,然後1−

pk即為該點被覆蓋的概率,也是該點的期望值(由於貢獻為1)

#include

int main()

}printf("case #%d: %.f\n",++t,ans);

}return

0;}

學習小結 期望,概率DP

bzoj 5058 期望逆序對 把貢獻按每對數分別統計,對於一對數,只需要統計他們相對位置關係,如果被換到其他位置概率等同,把相同概率的情況縮在一起。然後就有7種不同情況,討論後矩陣快速冪轉移 用數狀陣列統計前面那個貢獻,優化到nlogn 具體實現需要維護正反兩個樹狀陣列待寫 cf 838d 加入第...

期望及期望dp

簡單說就是概率 概率的價值 osu x 1 3 x3 3x2 3x 1 可以看出每多出乙個1,答案就會增加3x2 3x 1 於是可以維護x和x2的期望 x1 i x1 i 1 1 p i x2 i x2 i 1 2 x1 i 1 1 p i ans i ans i 1 3 x2 i 1 3 x1 i...

期望概率 dp

p4316 綠豆蛙的歸宿 p1850 noip2016 提高組 換教室 p3802 小魔女帕琪 p5104 紅包發紅包 p4550 收集郵票 f i frac f i 1 frac f 1 g i frac g i f i 1 frac g f 1 p1291 shoi2002 百事世界盃之旅 p3...