概率dp - UVA 11021 Tribles

简介: Tribles  Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059   Mean:  有k个细菌,每个细菌只能存活一天,在死去之前可能会分裂出0,1,2....n-1个细菌,对应的概率为p0,p1,p2....pn-1。

Tribles 

Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059


 

Mean: 

有k个细菌,每个细菌只能存活一天,在死去之前可能会分裂出0,1,2....n-1个细菌,对应的概率为p0,p1,p2....pn-1。

问:所有细菌在第m天全部灭亡的概率是多少?(m天以前灭亡也算在内)

analyse:

由于每一个细菌的生存是独立的,所以我们可以先算出一个细菌的概率为PP,最终答案应是:PP^k。

设dp[i]表示第i天全部灭亡的概率,那么:

  dp[i] = p0*(dp[i-1]^0) + p1*(dp[i-1]^1) + p2*(dp[i-1]^2) + ...pn-1*(dp[i-1]^(n-1))

其中pi*(dp[j-1]^i)表示:该细菌分裂成了i个,这i个细菌在第j-1天灭亡的概率。

由于每个细菌独立,所以是乘法,也就是i次方。

对于dp[0],代表第0天就全部灭亡,也就是根本没有分裂,所以dp[0]=p0.

 

Time complexity: O(N)

 

Source code:

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-26-20.36
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long( LL);
typedef unsigned long long( ULL);
const double eps( 1e-8);

const int MAXN = 1010;
double p [ MAXN ], dp [ MAXN ];
int main()
{
      ios_base :: sync_with_stdio( false);
      cin . tie( 0);
      int t;
      scanf( "%d" , & t);
      for( int Cas = 1; Cas <= t; ++ Cas)
      {
            int n , k , m;
            scanf( "%d %d %d" , &n , & k , & m);
            for( int i = 0; i <n; ++ i)
                  scanf( "%lf" , &p [ i ]);
            dp [ 0 ] =p [ 0 ];
            for( int i = 1; i < m; ++ i)
            {
                  dp [ i ] = 0.;
                  for( int j = 0; j <n; ++ j)
                  {
                        dp [ i ] +=p [ j ] * pow( dp [ i - 1 ], j);
                  }
            }
            printf( "Case #%d: %.7f \n " , Cas , pow( dp [ m - 1 ], k));

      }
      return 0;
}
/*

*/

 

目录
相关文章
UVa11968 - In The Airport
UVa11968 - In The Airport
55 0
uva10112 Myacm Triangles
uva10112 Myacm Triangles
42 0
|
C++
UVA 之10010 - Where's Waldorf?
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/24863879 ...
710 0
|
人工智能
uva 11300 - Spreading the Wealth
点击打开链接uva 11300 思路:数学分析+贪心 分析: 1 首先最终每个人的金币数量可以计算出来,它等于金币总数除以人数n。接下来我们用m来表示每人的最终的金币数 2 现在假设编号为i的人初始化为Ai枚金币,Xi表示第i个人给第i-1个人Xi枚金币,对于第一个人来说他是给第n个人。
861 0
uva10859Placing Lampposts
题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以他为一个端点的所有边,在灯的总数最小的前提下,被两盏灯同时照亮的边数应当尽量大。 分析:d(i,j)表示i的父节点放灯的状态为j(1表示放,0不放),以i为根的树的最小x值     x=Ma+c, a表...
788 0
uva10340 Ail in All
题意:输入两个字符串s和t,判断是否可以从t种删除0个或多个字符(其他字符不变),得到字符串s,比如abcde可以得到bce,单数无法得到dc 分析:简单模拟即可 1 #include 2 #include 3 #include 4 #define zz 5 usin...
572 0