码迷,mamicode.com
首页 > 其他好文 > 详细

sgu495:概率dp / 推公式

时间:2014-09-28 23:37:36      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   sp   div   c   

 概率题。。可以dp也可以推公式

 抽象出来的题目大意:

 有 n个小球,有放回的取m次  问 被取出来过的小球的个数的期望

 dp维护两个状态 第 i 次取出的是 没有被取出来过的小球的 概率dp[i] 和取出的是已经被取出来过的小球的概率np[i];

 如果第 i-1 次取出的是已经被取出来过的小球 那么第 i 次取出没有取出来过小球的概率即为 dp[i-1];

 反之则为 dp[i-1] - 1/n(没有取出来过的小球少了一个)

 所以可以得到状态转移方程 dp[i]=dp[i-1]*(dp[i-1]-1/n)+np[i-1]*dp[i-1];

 还可以推公式。。不过我还是觉得 推公式 得靠人品,能yy出来那当然是极好的。。。

 代码:

 

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<math.h>
#include<ctype.h>
using namespace std;
#define MAXN 10000
int n,m;
double dp[100010];
double np[100010];
double solve()
{
    double res=0;
    memset(dp,0,sizeof(dp));
    memset(np,0,sizeof(np));
    dp[1]=1;
    np[1]=0;
    for(int i=2;i<=m;i++)
    {
        dp[i]=dp[i-1]*(dp[i-1]-1.0/(double)n)+np[i-1]*dp[i-1];
        np[i]=1-dp[i];
    }
    for(int i=1;i<=m;i++)
    {
        res+=dp[i];
    }
    return res;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        printf("%.10lf\n",solve());
    }
    return 0;
}


公式。。

#include <stdio.h>
#include<math.h>
double n,m;
int main()
{
    while(scanf("%lf%lf",&n,&m)!=EOF)
    {
        printf("%.10lf\n",n-n*pow(((n-1)/n),m));
    }
    return 0;
}

 

sgu495:概率dp / 推公式

标签:style   blog   color   io   os   for   sp   div   c   

原文地址:http://www.cnblogs.com/oneshot/p/3999025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!