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

题意:

  有一个程序猿,他每天都会发现一个bug。

  bug共有n个种类。属于某一个种类的概率为1/n。

  有s个子系统,每个bug属于一个系统。属于某一个系统的概率为1/s。

  问你发现的bug能够覆盖到n个种类和s个系统的期望天数。

题解:

  期望dp转移的套路:

    倒着推。

    利用性质:期望 = ∑ (P(子期望)*φ(子期望))

  状态表示:

    dp[i][j] = expectation

    i:覆盖到i个种类

    j:覆盖到j个系统

    dp:从当前状态到达目标状态的期望天数(此状态的剩余天数)

  如何转移:

    套路。先考虑它能够转移到的子期望。

    now: dp[i][j]

    四种转移:

      (1)dp[i][j]:bug的没有覆盖新的区域。概率p0' = (i/n)*(j/s)

      (2)dp[i+1][j]:bug为新种类,不是新系统。概率p2 = (n-i)/n * j/s.

      (3)dp[i][j+1]:bug不是新种类,是新系统。概率p3 = i/n * (s-j)/s.

      (4)dp[i+1][j+1]:既是新种类,又是新系统。概率p4 = (n-i)/n*(s-j)/s

    利用期望性质:

      dp[i][j] = dp[i][j]*(i/n)*(j/s)

            + dp[i+1][j]*((n-i)/n)*(j/s)

            + dp[i][j+1]*(i/n)*((s-j)/s)

            + dp[i+1][j+1]*((n-i)/n)*((s-j)/s)

            + 1

    因为找到一个bug意味着过去了一天,所以dp[i][j]最后要+1。

    移项:

      dp[i][j] = (dp[i+1][j]*((n-i)/n)*(j/s)

            + dp[i][j+1]*(i/n)*((s-j)/s)

            + dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1)

            / (1 - (i/n)*(j/s))

  边界条件:

    达到目标状态时,剩余天数为0。

    dp[n][s] = 0

AC Code:

 // state expression:
// dp[i][j] = expectation
// i: found i kinds of bug
// j: in j different sys
//
// find the answer:
// ans = dp[n][s]
//
// transferring:
// dp[i][j] = dp[i][j]*(i/n)*(j/s)
// + dp[i+1][j]*((n-i)/n)*(j/s)
// + dp[i][j+1]*(i/n)*((s-j)/s)
// + dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1
//
// dp[i][j] = (dp[i+1][j]*((n-i)/n)*(j/s)
// + dp[i][j+1]*(i/n)*((s-j)/s)
// + dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1)
// / (1 - (i/n)*(j/s))
//
// boundary:
// dp[n][s] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005
#define MAX_S 1005 using namespace std; int n,s;
double dp[MAX_N][MAX_S]; void read()
{
cin>>n>>s;
} void solve()
{
memset(dp,,sizeof(dp));
for(int i=n;i>=;i--)
{
for(int j=s;j>=;j--)
{
if(i==n && j==s) continue;
double p1=(double)(n-i)/n*j/s;
double p2=(double)i/n*(s-j)/s;
double p3=(double)(n-i)/n*(s-j)/s;
double p0=1.0-(double)i/n*j/s;
dp[i][j]=(dp[i+][j]*p1+dp[i][j+]*p2+dp[i+][j+]*p3+)/p0;
}
}
} void print()
{
printf("%.4f\n",dp[][]);
} int main()
{
read();
solve();
print();
}

最新文章

  1. TortoiseSVN Clean up 失败的处理方法
  2. 你知道 Twitter,但你可能不知道它的 “成长模式” 和 “参与阶梯”
  3. 为什么在ucos向stm32f103移植时说os_cpu_c.c中有三个函数如OS_CPU_SysTickInit()需要注释掉
  4. js 监听输入框输入事件兼容ie7
  5. C++去掉字符串首尾的 空格 换行 回车
  6. FastReport安装说明(中文版)
  7. bootstrap-table 原来bootstrap还有这么强大的表格插件
  8. Hadoop学习3--安装ssh服务
  9. POJ 1953
  10. PAT 1089. Insert or Merge (25)
  11. linux之iptable案例
  12. jsp基本语法及运行原理
  13. 使用token和redis怎样判断账户是否失效和异地登录
  14. 微服务解决框架--SpringCloud
  15. C# Windows Service 基础
  16. html 腳本
  17. Java对象池技术的原理及其实现
  18. zabbix_agentd在windows上安装
  19. 【BZOJ】4894: 天赋
  20. RabbitMQ消息队列(五):Routing 消息路由[转]

热门文章

  1. mongodb模拟生产环境的分片集群
  2. kohana nginx的配置
  3. 网络编程-UDP-TCP
  4. 2、C++ 的升级
  5. ceres g2o 安装
  6. 将C#文档注释生成.chm帮助文档(转)
  7. 【Java项目实战】——DRP之HTML总结
  8. JavaOne2013 开发者大会
  9. HDFS源码分析数据块复制之PendingReplicationBlocks
  10. java和erlang之间的DES加解密