前言:期望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...