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 */
Gym 101174D Dinner Bet(概率DP)题解的更多相关文章
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) D.Dinner Bet 概率DP+排列组合
题目链接:点这里 题意: 1~N标号的球 现在A有C个,B有C个 每次可以随机得到D个不同的球(1~N);问你A或B中的C个球都出现一次的 期望次数 题解: dp[i][j][k]表示 随机出现了i个 ...
- POJ-1644 To Bet or Not To Bet(概率DP)
To Bet or Not To Bet Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1668 Accepted: 541 D ...
- Gym 101606F - Flipping Coins - [概率DP]
题目链接:https://codeforc.es/gym/101606/problem/F 题解: 假设 $f[i][j]$ 表示抛 $i$ 次硬币,有 $j$ 个硬币正面朝上的概率. 所以只有两种挑 ...
- [转]概率DP总结 by kuangbin
概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...
- Dinner Bet Gym - 101174D (期望dp)
Problem D: Dinner Bet \[ Time Limit: 1.5 s \quad Memory Limit: 256 MiB \] 题意 题意是两个人在玩游戏,一共有\(n\)张牌,这 ...
- 洛谷P2719 搞笑世界杯 题解 概率DP入门
作者:zifeiy 标签:概率DP 题目链接:https://www.luogu.org/problem/P2719 我们设 f[n][m] 用于表示还剩下n张A类票m张B类票时最后两张票相同的概率, ...
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
- Educational Codeforces Round 13 E. Another Sith Tournament 概率dp+状压
题目链接: 题目 E. Another Sith Tournament time limit per test2.5 seconds memory limit per test256 megabyte ...
- HDU 5781 ATM Mechine (概率DP)
ATM Mechine 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 Description Alice is going to take ...
随机推荐
- Python赋值、浅复制和深复制
Python赋值.浅复制和深复制 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...
- autocommit 隔离级别 next lock gap lock 事务隔离级别和锁
autocommit 隔离级别 https://www.ibm.com/developerworks/cn/opensource/os-mysql-transaction-isolation-leve ...
- FGC频繁 GC卡顿
https://mp.weixin.qq.com/s/I1fp89Ib2Na1-vjmjSpsjQ 线上服务的FGC问题排查,看这篇就够了! 原创 骆俊武 IT人的职场进阶 2020-05-10 ...
- (转载)微软数据挖掘算法:Microsoft 聚类分析算法(2)
介绍: Microsoft 聚类分析算法是一种"分段"或"聚类分析"算法,它遍历数据集中的事例,以将它们分组到包含相似特征的分类中. 在浏览数据.标识数据中的异 ...
- 1.4.1 对象与JSON转化 1.4.2 JSON与List集合转化 1.1.1 获取json中的属性 day10-05
1.1.1 对象与JSON转化 @Test public void toJSON() throws IOException{ Jedis jedis = new Jedis("192.168 ...
- HDU2222 Keywords Search__AC自动机
Keywords Search Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %I64d & %I64u Sub ...
- JVM详解总结
JVM详解总结 1.JVM内存模型 1.1 运行时数据区内存分布实例 1.2 类加载的生命周期 2.物理内存与虚拟内存 3.Java中需要使用内存的组件 3.1 Java堆 3.2 线程 3.3 类和 ...
- hbase 集群(完全分布式)方式安装
一,环境 1, 主节点一台: ubuntu desktop 16.04 zhoujun 172.16.12.1 从节点(slave)两台:ubuntu server 16.04 hadoo ...
- scanf()函数释疑(word找的,没源地址了)
scanf()函数释疑(上) 一.序言 scanf()函数的控制串的使用 例1. #include "stdio.h" int main(void) { int a,b,c; sc ...
- UML实战总结——机房收费系统UML第一版部分图展
距离机房收费系统已经过去了近2个月之久,如今的UML图才出来,从软件开发设计的逻辑上来讲这是顺序有问题的,不过,对于我们而言,而且是初次用面向对象的思想去设计和建模,就当是UML的一个实战练手的项目吧 ...