UVA 11021 繁衍麻球

题意:

一只麻球只能活一天,然后每天会生一次;

给出n,k,m;

n代表有一只麻球一次最多生n-1只;

接下来n行分别是生0到n-1只的概率p[i];

k代表一开始有k只麻球;问m天后麻球死光的概率

 

 

讲过的题

单独考虑每个麻球

dp[i]为一个麻球在i天内死亡的概率

那么有转移方程dp[i]=p[0]*dp[i-1]^0+p[1]*dp[i-1]^1+.....+p[n-1]*dp[i-1]^(n-1)

O(nm)转移即可

//%std
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define lovelive long long
#define lc son[x][0]
#define rc son[x][1]
#define lowbit(x) (x&(-x))
#define pt vc
void read(int &x)
{
  int p=1;
  x=0;
  char c=getchar();
  while(c<'0'||c>'9')
  {
    if(c=='-')
      p=-1;
    c=getchar();
  }
  while(c>='0'&&c<='9')
  {
      x=x*10+c-48;
      c=getchar();
  }
  x*=p;
}
double dp[1010],p[1010];
int main()
{
  int T,n,k,m;
  double ans,tmp;
  read(T);
  for(int t=1;t<=T;t++)
  {
      read(n);read(k);read(m);
      for(int i=0;i<n;i++)
        scanf("%lf",&p[i]);
    for(int i=1;i<=m;i++)
    {
      tmp=1;
      dp[i]=0; 
      for(int j=0;j<n;j++)
      {
          dp[i]+=p[j]*tmp;
          tmp*=dp[i-1];
      }
    }
    ans=1;
    for(int i=1;i<=k;i++)
      ans*=dp[m];
    printf("Case #%d: %.7lf\n",t,ans);
  }
  return 0;
}
/*
4
3 1 1
0.33
0.34
0.33
3 1 2
0.33
0.34
0.33
3 1 2
0.5
0.0
0.5
4 2 2
0.5
0.0
0.0
0.5
*/
View Code

 

posted @ 2018-04-15 21:44  NicoDafaGood  阅读(109)  评论(0编辑  收藏  举报