codevs 1060 搞笑运动会 概率dp

点击打开链接

题意: 计算一下排在队尾的两个人同时拿到一种票的概率是多少


思路:概率dp,dp[i][j]表示前i个人拿到j张A种票的概率  A和B都是一样的 所以答案乘2就好了

   转移: dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]*0.5;


代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 double dp[3000][3000];
 7 
 8 int main(){
 9     int n; cin>>n;
10 
11     dp[0][0] = 1; 
12     for(int i=1; i<=n; i++){
13         dp[i][0] = dp[i-1][0]*0.5;
14         for(int j=1; j<=n/2; j++){
15             if(j == n/2)
16                 dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]; //dp[i-1][j]:前i-1个人已经拿完A种票了,第i个人只能拿B。
17             else
18                 dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]*0.5;
19         }
20     }
21 
22     printf("%.4f\n",dp[n-2][n/2]*2);
23 }

 

posted @ 2017-02-18 12:21  _yxg123  阅读(104)  评论(0编辑  收藏  举报