概率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;
}
/*

*/

 

目录
相关文章
|
iOS开发 开发者
iOS证书(.p12)和描述文件(.mobileprovision)制作
iOS证书(.p12)和描述文件(.mobileprovision)制作
|
8月前
|
Python
使用 Python 合并微信与支付宝账单,生成财务报告
这篇博客介绍了如何使用 Python 脚本合并微信与支付宝账单数据,生成自动化财务报告。通过 pandas 库,学习如何清洗、合并和分析账单数据,以及如何生成 Markdown 格式的财务报告。
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
3120 2
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
196 1
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
348 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
|
存储 NoSQL 关系型数据库
2024 RedisAnd Mysql基础与进阶操作系列(16-4)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
Redis数据类型之Set类型及相关命令如:SADD/SMEMBERS/SCARD/SISMEMBER、SPOP/SREM/SRANDMEMBER/SMOVE、SDIFF/SDIFFSTORE/SINTER/SINTERSTORE 等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
746 0
|
算法 Java 测试技术
Java中的代码优化与重构策略
Java中的代码优化与重构策略
CTF--CRC宽高爆破脚本
CTF--CRC宽高爆破脚本
505 0
|
机器学习/深度学习 人工智能 算法
量子计算:变革未来的信息处理技术
本文探讨了量子计算的基本原理、当前进展及其潜在应用,揭示了这一新兴技术如何有望颠覆传统计算模式并开创信息处理的新纪元。