poj 2096 Collecting Bugs —— 简单期望DP

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

题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种;

所以设 f[i][j] 表示已经有几种,转移一下即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
int const xn=1005;
int n,s; db f[xn][xn];
int main()
{
  scanf("%d%d",&n,&s);
  for(int i=n;i>=0;i--)
    for(int j=s;j>=0;j--)
      {
    if(i==n&&j==s)continue;
    db p0=1.0*i/n*j/s,p1=1.0*(n-i)/n*j/s,p2=1.0*i/n*(s-j)/s,p3=1.0*(n-i)/n*(s-j)/s;
    f[i][j]=p1*f[i+1][j]+p2*f[i][j+1]+p3*f[i+1][j+1]+1;
    f[i][j]=f[i][j]/(1-p0);
      }
  printf("%.6f\n",f[0][0]);
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/Zinn/p/10278561.html