1. 程式人生 > >poj-2096-期望/dp

poj-2096-期望/dp

ostream air div AI get ace lan cst 我們

http://poj.org/problem?id=2096

    有n種病毒,s個服務器,每天等概率的在某個服務器上發現某一種病毒,問發現所有種類病毒且覆蓋所有的服務器的期望天數。

利用全期望公式可以將期望分解為子期望的加權和,權值就是子期望發生的概率Pi,註意SUM{ Pi }=1;

假如我們已經完成了(i,j),目標是(n,s),那麽下一天可能是(i,j) ,(i+1,j) ,(i,j+1) ,(i+1,j+1) 對應的Pi分別是 p1=(i/n)*(j/s) p2=(1-i/n)*(j/s) p3=(i/n)*(1-j/s) p4=(1-i/n)*(1-j/s)

設f(i,j)為完成了(i,j)距離目標的期望,那麽有f(i,j)=p1*(f(i,j)+1)+p2*(f(i+1,j)+1)+p3*(f(i,j+1)+1)+p4*(f(i+1,j+1)+1) | f(n,s)=0 ,移項解出f(i,j)即可。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<stack>
 6 #include<set>
 7 #include<map>
 8 #include<cmath>
 9 #include<ctime>
10 #include<time.h> 
11 #include<algorithm>
12 using namespace
std; 13 #define mp make_pair 14 #define pb push_back 15 #define debug puts("debug") 16 #define LL long long 17 #define pii pair<int,int> 18 #define eps 1e-12 19 20 double f[1100][1100]; 21 int main() 22 { 23 int n,m,i,j,k,t; 24 cin>>n>>m; 25 for(i=n;i>=0;--i){ 26 for
(j=m;j>=0;--j){ 27 if(i==n&&j==m) continue; 28 double p1=(double)i*j,p2=(double)j*(n-i), 29 p3=(double)i*(m-j),p4=(double)(n-i)*(m-j); 30 p1/=(1.0*n*m);p2/=(1.0*n*m);p3/=(1.0*n*m);p4/=(1.0*n*m); 31 f[i][j]=p1+p2*(f[i+1][j]+1)+p3*(f[i][j+1]+1)+ 32 p4*(f[i+1][j+1]+1); 33 f[i][j]/=(1.0-p1); 34 } 35 } 36 printf("%.4f\n",f[0][0]); 37 return 0; 38 }

poj-2096-期望/dp