2024 年春節集訓 _ 第一課 - 期望型別動態規劃

ChihiroFujisaki發表於2024-03-09

可能會用到的記號: \([P]=\begin{cases} 1 &(P 成立) \\ 0 & (P 不成立) \end{cases}\)

期望機率 \(\texttt{dp}\)

\(\texttt{dp}\) 的變形當中最為簡單易懂但是又思路又最為清奇。

與之相關的難題數不勝數。考場上可以想出正解的都是超級神仙。

粗淺的提一句,離散變數,也就是保證樣本可數的情況下的變數。而後文的隨機變數,大都是離散型隨機變數。

相關定義:

我們可以用數學的方法理解他們。

可數:像自然數一樣可以一個一個計數的。

因為我並沒有太好的機率相關的基礎學習,所以我只能這樣:

機率,期望與頻數直方圖

對於一個變數,它在有限個樣本當中出現。而現在已知這個樣本。

作頻數直方圖。而機率 \(P\) 也就是 \(\dfrac{S}{C}\) ( 其中 \(S\) 表示樣本容量,\(C\) 表示該種取值出現的次數 )。不難發現,機率 \(P\) 也即這個隨機變數的取值出現頻率。

記這個隨機變數為 \(X\),它的取值分別為 \(X_1,X_2,\cdots,X_i,\cdots,X_n.\) 而我們記 \(E(X)\)\(X\) 的數學期望。

期望,簡單地說是隨機變數 \(X\) 的所有取值的平均值。求平均數可以用整個頻數直方圖求和然後除以他的樣本容量得到。也就是:

\[E(X)=\dfrac{\sum_{i=1}^n X_iC_i}{\sum C_i} \]

稍微用上文的公式化簡,就可以得到書上最後的公式:

\[E(X)=\sum _{i=1} ^n X_i P(X=X_i) \]

如果這個隨機變數的取值非有限但是可數,那麼

\[E(X)=\sum_{i=1}^{\infty} X_iP(X=X_i) \]

這裡, \(P(X=X_i)\)\(X\) 取到 \(X_i\) 的機率。

我怎麼好像說了一大堆廢話啊。。

可以想象,\(E(X)\)\(X\) 的隨機取值組成的集合的平均值。

但是這裡通常不會討論隨機變數取值可數的情況。

重要性質

有常數 \(c\),隨機變數 \(X,Y\)

  1. \(E(c)=c.\)

  2. 數學期望的線性性質: \(E(cX)=cE(X).\)

  3. 數學期望的線性性質: \(E(X+Y)=E(X)+E(Y)\)

  4. 數學期望對於乘法的準分配律:當 \(X,Y\) 相互獨立, \(E(XY)=E(X)E(Y)\)

什麼是相互獨立呢?

\(X,Y\) 的取值集合分別為 \(\{X_i\}\) 以及 \(\{Y_i\}\) ,而對於任意 \(i,j\),有 \(P(X=X_i,,Y=Y_j)=P(X=X_i)P(Y=Y_j)\)

  1. 全期望公式:

\[E(X)=\sum_{y=I(Y)} E(X|Y=y) \cdot P(Y=y) \]

其中,\(I(Y)\)\(Y\) 的取值集合,而 \(E(X|Y=y)\) 表示 \(Y=y\) 的情況下 \(X\) 的期望取值。

數學期望是一個所有實驗結果的平均值

逆天的是,這裡面並沒有基本性質,每一個都可以得到證明。

再給出一個基於本質可以被理解的性質:

\[P(A)=\sum_{i} P(A|B_i)P(B_i) \]

這個性質被稱作 \(*\) 全機率公式 \(*\)

其中 \(A|Bi\)\(B_i\) 事件成立時 \(A\) 事件成立的機率。

有一個易錯點:\(E(X^2)=E^2(X)\) 不一定成立。

期望機率 \(dp\) 例題。

【例題 1】期望分數

\(link\)

設在 \(i\) 的得分是 \(x\) ,有 \(x_i\) 個連續的 \(1.\)

\[E(i)=p_i[(x_i+1)-x_i^3]+(1-p_i)E(0)+E(i-1) \]

多項式乘法化簡,最後得到

\[E(i-1)+p_i[3x_i^2+3x_i+1] \]

問題轉移到 \(E^2(x_i)\) 以及 \(E(x_i)\)

\[E^2(x_i)=p_iE(x_{i-1}+1)^2+(1-p_i)E(0)=p_i[E^2(x_{i-1})+2E(x_{i-1})+1] \]

\[E(x_i)=p_i[E(x_i-1)+1] \]

code
#include <bits/stdc++.h>
#define ll long long
#define db double
const int N=1e5+10;
db E[N],Ex[N],Ex2[N],p[N];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%lf",&p[i]);
	for(int i=1;i<=n;++i){
		Ex[i]=p[i]*(Ex[i-1]+1);
		Ex2[i]=p[i]*(Ex2[i-1]+2*Ex[i-1]+1);
		E[i]=E[i-1]+p[i]*(3*Ex2[i-1]+3*Ex[i-1]+1);
	}
	printf("%.1lf\n",E[n]);
}

相關文章