POJ 2096(概率DP)

原创 2016年02月24日 16:48:31

题目链接:POJ 2096

解题思路:
总的来说状态方程还是蛮好想的,每次找bug的时候,有可能会出现四种情况,一是在已经找到bug的系统中找到了旧bug,二是在新的系统中找到旧bug,三是在已经找到bug的系统中找到了新bug,二是在新的系统中找到新bug。于是,状态dp[i][j]表示在 j 个系统中找到 i 个bug需要的天数期望,初始状态dp[0][0]=0,状态转移方程如下:

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

通过移向可以得到新的一条方程:

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

然而,这样做是会有问题的,问题在于最后一次递推,即 i = n 且 j = s 的时候,会出现除以0的情况,这样显然得不到正确结果,而且这也间接说明,这个状态方程其实是错的。因此我们需要对状态进行修改,即状态dp[i][j]表示在 j 个系统中找到 i 个bug后,距离目标状态的天数期望,初始状态dp[n][s]=0,状态转移方程如下:

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

最终转移方程如下:

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

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n,s;
double dp[1005][1005];

int main()
{
    while(~scanf("%d %d",&n,&s))
    {
        double p1,p2,p3;

        for(int i=n;i>=0;i--)
        {
            for(int j=s;j>=0;j--)
            {
                if(i==n&&j==s)
                    continue;

                p1=double((n-i)*j)/n/s;             
                p2=double((i)*(s-j))/n/s;               
                p3=double((n-i)*(s-j))/n/s;

                dp[i][j]=(p1*dp[i+1][j] + p2*dp[i][j+1] + p3*dp[i+1][j+1] + 1) / (1.0-double(i*j)/n/s);
            }
        }
        printf("%.4f\n",dp[0][0]);
    }

    return 0;
}

总结:
1、概率DP,套基本的期望公式即可;
2、逆向递推,
3、此题精度有毒

POJ 2096 概率DP 解题报告

Collecting BugsDescriptionIvan is fond of collecting. Unlike other people who collect post stamps, c...
  • onepointo
  • onepointo
  • 2017年07月24日 21:32
  • 92

poj 2096<概率dp>

这是数学题 大概是分四类情况
  • ahjkl007
  • ahjkl007
  • 2014年06月27日 02:14
  • 264

POJ 2096 概率DP

题意:    一个软件有s个子系统,n种bug,一个人每天可以发现一个bug    求发现n种bug且每个子系统至少有一个bug的期望(也就是平均天数) 分析: 这是我的第一道概率DP问题,看...
  • wenzhunpu
  • wenzhunpu
  • 2016年02月14日 22:38
  • 237

POJ 2096 概率dp

题意:一个软件有s个子系统,会产生n种bug。     某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。     求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数...
  • u013491262
  • u013491262
  • 2014年06月21日 22:27
  • 292

poj 2096 概率DP 解题报告

Ivan is fond of collecting.
  • Hawo11
  • Hawo11
  • 2017年07月30日 12:06
  • 156

poj 2096 概率dp

http://poj.org/problem?id=2096 G++ WA  C++ AC 题解看这个吧:我没看懂题目,所以找的题解翻译:http://blog.csdn.net/morgan_x...
  • u011026968
  • u011026968
  • 2014年07月28日 17:44
  • 784

poj 2096概率dp

题意如下: 有一个软件,由s个子系统构成,它会产生n种类型bug,一个人每天发现一个bug,该bug会属于s个子系统,n种bug。问发现所有s个子系统和n种bug的期望天数。 简单概率dp。 我...
  • Kamisama123
  • Kamisama123
  • 2017年06月06日 19:17
  • 90

poj 2096 概率dp详解

Collecting Bugs Time Limit: 10000msMemory Limit: 64000KB This problem will be judged on PKU. Origin...
  • jianbagengmu
  • jianbagengmu
  • 2017年05月30日 12:48
  • 111

POJ 2096 概率DP入门

【题目链接】 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21521【解题报告】 一共有n种bug,s个系统,每天发现一...
  • gungnir0711
  • gungnir0711
  • 2016年02月25日 14:50
  • 175

poj 2096 概率dp

题目:点击打开链接 题意: 一个软件有s个子系统,会产生n种bug。     某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。     求找到所有的n种bug,且每个...
  • loveyou11111111
  • loveyou11111111
  • 2016年02月20日 18:43
  • 161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2096(概率DP)
举报原因:
原因补充:

(最多只允许输入30个字)