期望&概率dp總結
阿新 • • 發佈:2019-01-25
總算刷完kuangbin期望&概率專題了,下面總結一下心得和題解!
1.期望dp
期望dp通常逆推,即從結果推向初始狀態,也可以用記憶化搜尋進行dp;
E=Σp1*(E1+X1)+Σp2*(E+X2)
其中E為當前狀態的期望,E1為下一個狀態的期望,p1和X1分別為將當前狀態轉移到下一個狀態的概率和花費,p2和X2分別為保持當前狀態的概率和花費。
最後化簡為E=(Σp1*(E1+X1)+Σp2*X2)/(1-Σp2)
2.概率dp
概率dp通常順推,即從初始狀態推向結果,E=Σp1*E1
其中E為當前狀態的概率,E1為上一個狀態的概率,p1是由上一個狀態轉移到當前狀態的概率
3.高斯消元
當概率dp不能用遞推式進行狀態轉移時,就需要用到高斯消元
如果有n個狀態,則需要建立n*(n+1)行的矩陣,用A[i][j]表示
A[i][j]表示由狀態i轉移到狀態j的概率,通常將最後一列設為0,再讓A[i][i]+=-1
const double eps = 1e-6; typedef vector<double> vec; typedef vector<vec> mat; vec gauss_jordan(const mat& A, const vec& b) { int n = A.size(); mat B(n, vec(n + 1)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) B[i][j] = A[i][j]; for (int i = 0; i < n; i++) B[i][n] = b[i]; for (int i = 0; i < n; i++) { int pivot = i; for (int j = i; j < n; j++) { if (fabs(B[j][i]) > fabs(B[pivot][i])) pivot = j; } swap(B[i], B[pivot]); if (fabs(B[i][i]) < eps) return vec(); for (int j = i + 1; j <= n; j++) B[i][j] /= B[i][i]; for (int j = 0; j < n; j++) { if (i != j) { for (int k = i + 1; k <= n; k++) B[j][k] -= B[j][i] * B[i][k]; } } } vec x(n); for (int i = 0; i < n; i++) x[i] = B[i][n]; return x; }