概率/期望 dp,是一種 dp,用來計算概率或者是期望。
其實我認為這種 dp 就是計算期望的,畢竟概率可以看成代價為 1 的期望。
沒有學過期望的讀者可以看看這篇文章:演算法學習筆記:概率與期望
而概率/期望 dp,最關鍵的就是期望方程。
下面看一道例題。
cf1265e beautiful mirrors
以這題為例,詳細講解期望 dp 的一般套路。
為了方便,下面直接認為 p
ip_i
pi 就是概率。
首先設狀態。
期望 dp 設狀態:f[i
]=從1
到i的期
望(天數
/步數/
代價/.
..
)f[i]=從 1 到 i 的期望(天數/步數/代價/...)
f[i]=從
1到i的
期望(天
數/步數
/代價/
...)
。對於這道題,f
if_i
fi 為從第一面鏡子到第 i
ii 面鏡子都高興的期望天數。
期望 dp 的轉移:使用 fi−
1,fi
f_,f_i
fi−1,
fi 列期望方程。
列期望方程是重點!不能列錯!還有不要解錯
第 ii
i 天詢問失敗,從頭開始。
此時概率為 1−p
i1-p_i
1−pi
,消耗天數為 fi−
1+1+
fi
f_+1+f_i
fi−1+
1+fi
,於是概率乘代價為 (1−
pi)(
fi−1
+1+f
i)
(1-p_i)(f_+1+f_i)
(1−pi
)(fi
−1+
1+fi
)。第 i
ii 天詢問成功。
此時概率為 p
ip_i
pi,消耗天數 fi−
1+
1f_+1
fi−1+
1,於是概率乘代價為 pi(
fi−1
+1
)p_i(f_+1)
pi(fi
−1+
1)。
綜上,有 fi=
(1−p
i)(f
i−1+
1+fi
)+pi
(fi−
1+1)
f_i=(1-p_i)(f_+1+f_i)+p_i(f_+1)
fi=(1
−pi
)(fi
−1+
1+fi
)+p
i(f
i−1
+1)。
然而 p
ip_i
pi 只是概率,真正**中還需要除以 100 才行。
除以 100 之後最後解得 fi=
100(fi
−1+1
)p
if_i=\dfrac+1)}
fi=pi
100
(fi−
1+1
),線性遞推即可,不要忘記逆元。
總結一下期望 dp 的一般套路:
設狀態 f
if_i
fi 為從 1 到 i
ii 的期望天數/步數/…
列出關於 fi−
1f_
fi−1
和 f
if_i
fi 的期望方程。解方程,然後線性遞推。
如果有特別的初值要加上。
幾個注意點:
期望方程不要列錯,一定要考慮到每一種情況。方程不要解錯
初值不能漏。
例題的**:
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
2e5+
10, p =
998244353
;int n, p[maxn]
;ll f[maxn]
;int
read()
while
(ch >=
'0'&& ch <=
'9')
return sum * fh;
}ll ksm
(ll a, ll b)
return ans;
}int
main()
概率/期望 dp 的練習題請前往 dp 演算法總結&專題訓練1(概率/期望 dp & 數字 dp)。 學習筆記 期望DP題單 概率,期望DP
目錄貳 典例營 做過很多期望的題了,但是一直沒有系統地學習過期望,這幾天終於有時間攻堅這個重要但是對我而言難得一匹的問題了.實際上我 dp 也菜得一匹。傳送門 to oi wiki 一般我們使用 p x 表示 x 發生的概率,e x 表示 x 發生的期望。我們有兩者的關係 e x sum p x i...
演算法 概率與期望DP
前兩節主要針對題目分析,沒時間的珂以跳過。首先舉一道簡單 經典的好題 lightoj1038 race to 1 again 懶得單獨寫,安利一下dennyqi同學的部落格 很顯然很多期望題的狀態是和自己有關的,怎麼辦呢,難道不停的搜尋自己?上面的方法顯然行不通,於是我們只能簡單變形一下。很容易列出...
期望概率 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...