zoukankan      html  css  js  c++  java
  • poj-2096-期望/dp

    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
    ",f[0][0]);
    37     return 0; 
    38 }
  • 相关阅读:
    第三章感想
    第二章感想
    第一章感想
    第9章 硬件抽象层:HAL
    第10章 嵌入式linux的调试技术
    第8章 蜂鸣器驱动
    第七章 I/O
    第六章 编写Linux驱动程序
    第五章 S3C6410
    源代码的下载和编译
  • 原文地址:https://www.cnblogs.com/zzqc/p/8979380.html
Copyright © 2011-2022 走看看