[填坑]期望概率DP 入門級別
阿新 • • 發佈:2017-10-05
using pri == ble for ostream cst space 入門級
poj 2096 Collecting Bugs 期望DP
這道題是最入門的期望DP,然而我並不是很會做,甚至連題都沒看懂。。(其實是English不好 相信我)
題解:
在這裏有s,n兩個變量,假設dp[i][j]表示已經發現i種bug存在j個系統到期望天數所需要的天數,
顯然dp[n][s]=0;
從dp[i][j]經過一天後可能得到以下四種情況:
dp[i][j]->dp[i+1][j+1]; 在一個新的系統裏面發現一個新的bug
dp[i][j]->dp[i+1][j]; 在原來已發現過bug的系統裏發現一個新的bug
dp[i][j]->dp[i][j+1]; 在一個新的系統裏面發現一個已被發現過的bug
dp[i][j]->dp[i][j]; 在已發現過bug的系統發現已發現過的bug
四種到達的概率分別是:
p1=(n-i)*(s-j)/(n*s);
p2=(n-i)*j/(n*s);
p3=i*(s-j)/(n*s);
p4=i*j/(n*s);
所以dp[i][j]=p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i][j]+1
推一下就是 dp[i][j]=(p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+1)/(1-p4);
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define pos(i,a,b) for(int i=(a);i<=(b);i++) #define pos2(i,a,b) for(int i=(a);i>=(b);i--) #define N 1010 double n,s; double dp[N][N]; int main(){ scanf("%lf%lf",&n,&s); pos2(i,n,0){ pos2(j,s,0){ if(i==n&&j==s) continue; dp[i][j]=((dp[i+1][j]*(n-i)*(j)+dp[i][j+1]*(i)*(s-j)+dp[i+1][j+1]*(n-i)*(s-j))/(n*s)+1)/(1-(i*j)/(n*s)); } } printf("%.4lf",dp[0][0]); return 0; }
[填坑]期望概率DP 入門級別