zoukankan      html  css  js  c++  java
  • sgu495:概率dp / 推公式

     概率题。。可以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
    ",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*pow(((n-1)/n),m));
        }
        return 0;
    }
  • 相关阅读:
    eclipse开发环境搭建
    如何在不知道密码的情况下卸载趋势防毒墙网络版
    PB 将游标中的数据存到数组中
    SQL Server 系统表使用举例
    row_number() over(partition by a order by b desc) rn 用法
    C#选中当前一行,判断是否为空(顺序)
    C#DataTable与Grid的差别
    C#采番的前端与SQL的写法
    Grid的check
    Combox的去重方法
  • 原文地址:https://www.cnblogs.com/oneshot/p/3999025.html
Copyright © 2011-2022 走看看