Gym 101174D Dinner Bet(概率DP)题解

题意:n个球,两个人每人选C个球作为目标,然后放回。每回合有放回的拿出D个球,如果有目标球,就实现了这个目标,直到至少一个人实现了所有目标游戏结束。问结束回合的期望。误差1e-3以内。

思路:概率DP,因为终止条件是目标数,那么A的目标数B的目标数是一定要有的,但是AB之间可能有交集,那么我就把他单独列出来,我们设dp[t][i][j][k]表示第t回合a有i个独有的没涂b有j个独有的没涂有k个共有的没涂。那么我们可以得到状态转移方程:

$\LARGE{dp[t][ii][jj][kk] = dp[t - 1][i][j][k] * \frac{C^{i - ii}_{i}  *  C^{j - jj}_{j}  *  C^{k - kk}_{k}  *  C^{d - (i - ii) - (j - jj) - (k - kk)}_{n - i - j - k}}{C_{n}^{d}}}$

代码:

#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1e4 + 7;
double dp[maxn][15][15][15];
//第t回合a有i个没涂b有j个没涂有k个共有的没涂
double C[65][65];   //Cn m
int n, d, c, sz, cmn;
set<int> a;
void init(){
    C[0][0] = C[1][0] = C[1][1] = 1;
    for(int i = 2; i < 60; i++){
        for(int j = 0; j <= i; j++){
            C[i][j] = j == 0? 1 : C[i - 1][j - 1] + C[i - 1][j];
        }
    }
}
double solve(int i, int j, int k, int ii, int jj, int kk){
    //printf("%f\n", C[i][i - ii] * C[j][j - jj] * C[k][k - kk] * C[n - i - j - k][d - (i - ii) - (j - jj) - (k - kk)] / C[n][d]);
    return C[i][i - ii] * C[j][j - jj] * C[k][k - kk] * C[n - i - j - k][d - (i - ii) - (j - jj) - (k - kk)] / C[n][d];
}
int main(){
    init();
    scanf("%d%d%d", &n, &d, &c);
    a.clear();
    cmn = 0;
    for(int i = 1; i <= c; i++){
        int x;
        scanf("%d", &x);
        a.insert(x);
    }
    for(int i = 1; i <= c; i++){
        int x;
        scanf("%d", &x);
        if(a.count(x)) cmn++;
    }
    for(int t = 0; t <= 1000; t++)
        for(int i = 0; i <= c - cmn; i++)
            for(int j = 0; j <= c - cmn; j++)
                for(int k = 0; k <= cmn; k++)
                    dp[t][i][j][k] = 0;
    dp[0][c - cmn][c - cmn][cmn] = 1;

    for(int t = 1; t <= 1000; t++){
        for(int i = 0; i <= c - cmn; i++){
            for(int j = 0; j <= c - cmn; j++){
                for(int k = 0; k <= cmn; k++){
                    for(int ii = 0; ii <= i; ii++){
                        for(int jj = 0; jj <= j; jj++){
                            for(int kk = 0; kk <= k; kk++){
                                if(i - ii + j - jj + k - kk > d) continue;
                                if(i + j + k > n) continue;
                                if(i + k == 0 || j + k == 0) continue;
                                dp[t][ii][jj][kk] += dp[t - 1][i][j][k] * solve(i, j, k, ii, jj, kk);
                            }
                        }
                    }
                }
            }
        }
    }

    double ans = 0;
    for(int t = 1; t <= 1000; t++){
        for(int i = 1; i <= c - cmn; i++)
            ans += dp[t][i][0][0] * t + dp[t][0][i][0] * t;
        ans += dp[t][0][0][0] * t;
    }

    printf("%.5lf\n", ans);
    return 0;
}
/*
30 5 10
2 3 5 7 11 13 17 19 23 29
20 18 16 14 12 10 8 6 4 2

*/

原文地址:https://www.cnblogs.com/KirinSB/p/10926715.html

时间: 2024-10-16 10:55:16

Gym 101174D Dinner Bet(概率DP)题解的相关文章

POJ1644:To Bet or Not To Bet(概率DP)

Description Alexander Charles McMillan loves to gamble, and during his last trip to the casino he ran across a new game. It is played on a linear sequence of squares as shown below. A chip is initially placed on the Start square. The player then trie

Gym 101606F - Flipping Coins - [概率DP]

题目链接:https://codeforc.es/gym/101606/problem/F 题解: 假设 $f[i][j]$ 表示抛 $i$ 次硬币,有 $j$ 个硬币正面朝上的概率. 所以只有两种挑选硬币的情况: 1.正面硬币数量为 $[0,n-1]$,选择反面硬币抛,则正面硬币数量比原本增加 $1$ 或者不变. 2.正面硬币数量为 $n$,随便选择一个硬币抛,则正面硬币数量比原本减少 $1$ 或者不变. 因此可得状态转移方程: 对于 $j<n$,有 f[i+1][j+1]+=f[i][j]*

hdu4089(公式推导)概率dp

题意:有n人都是仙剑5的fans,现在要在官网上激活游戏,n个人排成一个队列(其中主角Tomato最初排名为m), 对于队列中的第一个人,在激活的时候有以下五种情况: 1.激活失败:留在队列中继续等待下一次激活(概率p1) 2.失去连接:激活失败,并且出队列然后排到队列的尾部(概率p2) 3.激活成功:出队列(概率p3) 4.服务器瘫:服务器停止服务了,所有人都无法激活了(概率p4) 求服务器瘫痪并且此时Tomato的排名<=k的概率. 解法:ans[i][j]表示i个人出于第j个位置要到目的状

【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Status][Discuss] Description 几乎是一路看题解过来了.. 拖了一个星期的题目- - 已然不会概率DP(说得好像什么时候会过一样),高斯消元(打一次copy一遍). 发现异或题目的新解决方法:按位处理.. 发现DP新方法:高斯消元. f[k][i]代表第k位权值起点为i到终点时答案

POJ2151Check the difficulty of problems 概率DP

概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍,m个题目,每个队伍做出哪道题的概率都给了,冠军队伍至少也解除n道题目,所有队伍都要出题,问你概率为多少? 一开始感觉是个二维的,然后推啊推啊没有推出来,一开始认为冠军队伍只能有一个,所以必须控制一个队伍解题数比其它队伍多,而且这个冠军队伍解题数必须大于等于n,大于n的时候其它队伍解题数就很难了,直到坑到最后才发现 原来可以很多队伍都是冠军,大家都是十道 那么大家都是冠军,---- 然后还是继续推二维,结果还是没想出,看来不是先假设方程才好

【bzoj3566】[SHOI2014]概率充电器 树形概率dp

题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定.随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电.作为 SHOI 公司的忠实客户,你无

zoj 3822 Domination 【概率DP 求期望】

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

hdu 4035 概率DP 成都网赛

http://acm.hdu.edu.cn/showproblem.php?pid=4035 学到: 1.先判断是不是树,其实凡是有图的感觉的,都看边数==点数-1是不是成立 2.树有时候区分老子跟孩子还是有必要的,这道题就是,不过是在dfs的时候,传参数的时候多加个表示父节点的参数而已 3.一定注意,概率DP对精度真的要求很高 开始的时候写1e-8,WA了好几发,改了1e-10  AC 4.注意分母为0的可能的时候加上判断 讲的很详细的题解:http://blog.csdn.net/morga

POJ 2151 Check the difficulty of problems:概率dp【至少】

题目链接:http://poj.org/problem?id=2151 题意: 一次ACM比赛,有t支队伍,比赛共m道题. 第i支队伍做出第j道题的概率为p[i][j]. 问你所有队伍都至少做出一道,并且有队伍做出至少n道的概率. 题解: 关于[至少]问题的表示. 对于每一支队伍: mst[i][j] = P(第i支队伍做出至多j道题) 则 P(第i支队伍做出至少j道题) = 1 - mst[i][j-1] 对于所有队伍: P(所有队伍至少答出一题) = ∏ (1 - mst[i][0]) P(