概率期望dp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了概率期望dp相关的知识,希望对你有一定的参考价值。

1.codevs1060 搞笑世界杯

题目描述 Description

搞笑世界杯的球票出售方式也很特别,它们只准备了两种球票.A 类

票------免费球票 B 类票-------双倍价钱球票.购买时由工作人员通过掷硬币决定,投到正面

的买A类票, 反面的买B类票.并且主办方不可能倒贴钱,所以他们总是准备了同样多的A类票和B类票

 你和你的朋友想计算一下排在队尾的两个人同时拿到一种票的概率是多少

(包括同时拿A 类票或B类票) 假设工作人员准备了2n 张球票,其中n 张A类票,n 张B类票,并且排在队伍中的人每人必须且只能买一张球票(不管掷到的是该买A 还是该买B).

思路:先说一个比较坑爹的事情,读入的是2n,不是n。f[i][j]表示第i人买票时买了j张A票的概率。对于j有三种情况:

  1)j=0:f[i][j]=f[i-1][j]*0.5;   2)0<j<n:f[i][j]=(f[i-1][j]+f[i-1][j-1])*0.5;  3)j=n:f[i][j]=f[i-1][j]+f[i-1][j-1]*0.5。

初始化f[0][0]=1;输出f[n*2-2][n]*2(因为最后两张可以全是A或B);

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
double f[3000][3000];

int main()
{
    int n,i,j;
    scanf("%d",&n);n/=2;
    f[0][0]=1;
    for (i=1;i<=2*n;++i)
      for (j=0;j<=n;++j)
      {
          if (j>i) continue;
          if (j==0) f[i][j]=f[i-1][j]*0.5;
          else
          {
              if (j<n) f[i][j]=(f[i-1][j]+f[i-1][j-1])*0.5;
              else f[i][j]=f[i-1][j]+f[i-1][j-1]*0.5;
          }
      }
    printf("%.4f\n",f[n*2-2][n]*2);
}
Code

 

以上是关于概率期望dp的主要内容,如果未能解决你的问题,请参考以下文章

期望与概率dp

石头剪刀步(rps):dp,概率&期望

POJ 2096Collecting Bugs 概率期望dp

HDU-4035 Maze (概率DP求期望)

2021陕西省赛 D.Disease(树形dp&期望dp)

2021陕西省赛 D.Disease(树形dp&期望dp)