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

概率期望dp

时间:2017-08-13 12:21:55      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:none   --   dev   cstring   多少   using   printf   2-2   show   

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

标签:none   --   dev   cstring   多少   using   printf   2-2   show   

原文地址:http://www.cnblogs.com/L-Memory/p/7352637.html

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