题目描述

原题链接

有一天,蒜头君当上了国王。蒜头君的王国有 n n n 坐城市,现在他需要在城市之间修建道路使得城市之间相互联通。
蒜头君是一个不会规划的人,他不知道哪些城市之间必须要有道路,所以对于任意两座城市之间,蒜头军会修建道路的概率为 p p p。
请你计算一下最后修建出来的道路使得 n n n 座城市都联通的概率。

输入格式

输入包含一个整数 n ( 1 ≤ n ≤ 20 ) n(1≤n≤20) n(1≤n≤20) 和一个实数 p ( 0 ≤ p ≤ 1 ) p(0≤p≤1) p(0≤p≤1).

输出格式

输出一行一个实数表示答案,输出结果误差在 1 0 − 5 10^{−5} 10−5 以内都认为正确。

输入样例

3 0.6

输出样例

0.6480000

分析

参考大佬的题解
题目让求 n n n个点都联通的概率 F ( n ) F(n) F(n)。不妨先求一下 n n n个点组成的图不连通的概率 G ( n ) G(n) G(n)
考虑n个点组成的图不连通有以下 n − 1 n-1 n−1中情况:
1 1 1个点连通, 且这 1 1 1个点组成的连通块, 与其余 n − 1 n-1 n−1个点没有边相连
2 2 2个点连通, 且这 2 2 2个点组成的连通块, 与其余 n − 2 n-2 n−2个点没有边相连

k k k个点连通, 且这 k k k个点组成的连通块, 与其余 n − k n-k n−k个点没有边相连

n − 1 n-1 n−1个点连通, 且这 n − 1 n-1 n−1个点组成的连通块, 与剩余的 1 1 1个点没有边相连

考虑有 k k k个点连通的情况:
首先要选 k k k个点, 而第 n n n个点一定选,则再从 n − 1 n-1 n−1个点中选择 k − 1 k-1 k−1个, 即 C n − 1 k − 1 C_{n-1}^{k-1} Cn−1k−1​
然后保证这 k k k个点连通, 即 F ( k ) F(k) F(k)
最后保证这 k k k的点与其余 n − k n-k n−k个点没有边相连, 即 ( 1 − p ) k ( n − k ) (1-p)^{k(n-k)} (1−p)k(n−k) ( p p p为两点间修路的概率)
从而根据上述 n − 1 n-1 n−1种情况求出 G ( n ) G(n) G(n), 则 题目所求 F ( n ) = 1 − G ( n ) F(n) = 1-G(n) F(n)=1−G(n)

实现

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 29;
int n;
double p;
double f[N]; // f[i]表示n个点都联通的概率
int c(int a, int b) // 计算组合数 C(a,b), 即从a个点中选b个点
{int sum = 1;for(int i=1; i<=b; i++) sum = sum*(a-b+i)/i;return sum;
}
int main()
{cin >> n >> p;f[1] = 1, f[2] = p; // 易知: 1个点联通的概率为1, 2个点联通概率为p;for(int i=3; i<=n; i++){double fail = 0; // 表示i个点不联通的概率for(int j=1; j<=i-1; j++){fail += ( c(i-1, j-1)*f[j]*pow(1.0-p,j*(i-j)) );}f[i] = 1.0-fail;}printf("%.7lf",f[n]);return 0;
}

关于上述实现中组合数 C n m C_n^m Cnm​的计算

计蒜客 A1596.蒜头君王国 概率计算(dp)相关推荐

  1. 计蒜客:蒜头君吃桃(java)

    采用循环思想(递归调用) 递归是计算机编程中应用最广泛的一个技巧,也是比较难理解的一个技巧,所以我们打算花大量的时间来理解递归.所谓递归,就是函数调用函数自身 ,一个过程或者函数在其定义或说明中有直接 ...

  2. 【计蒜客】蒜头君上班 C++ and C语言

    蒜头君上班 蒜头君可以选择行走和骑车两种方式上班.但实际上,他并不清楚哪种方式更快,因为骑车总要找车.开锁.停车.锁车等,这要耽误一些时间. 假设找到自行车,开锁并骑上自行车的时间为 27 秒:停车锁 ...

  3. 【动态规划】计蒜客:蒜头君的日志(最长递增公共子序列)

    dp[i][j]:同时以nums[i]结尾和nums[j]结尾的最长递增公共子序列 初始化: dp[0][j]=0 dp[j][0]=0 状态转移方程: nums[i]!=nums[j] dp[i][ ...

  4. 【动态规划】计蒜客:蒜头君闯关(最长递增子序列的变体)

    题意: 求递增子序列之和的最大值 dp[i]:以nums[i]结尾的递增子序列之和的最大值  初始化:                 dp[0]=nums[0] 状态转移方程: dp[i]=max{ ...

  5. 【宽度优先搜索】计蒜客:蒜头君回家(带条件的BFS)

    8 10 P.####.#P# ..#..#...# ..#T##.#.# .......... ..##.##### .......... #####...## ###....S## 21 求最短步 ...

  6. 【计蒜客】蒜头君的旅游计划

    题目 思路 递归出口:如果你到达的点已经到达了所有城市. 最优性剪枝:如果你当前到达点的花费已经超过了当前的最优解,就直接退出. 代码 #include<bits/stdc++.h> us ...

  7. 计蒜客c语言 蒜头君招聘程序,计蒜客 数据结构 蒜头君筛选用户

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 测试了很多样例都是对的 但一直过不去 求大神( ⊙ o ⊙ )啊! #include #include using namespace std; clas ...

  8. *【计蒜客 - 蓝桥训练】人以群分(二分 + dp)

    题干: 某班有 nn 个同学,每个同学有一个外向程度 a_iai​.由于要进行某个活动,需要把他们分成若干个小组,每个小组的人数至少为 mm 人.不同外向程度的人在一个小组会产生不开心值,定义一个小组 ...

  9. 计蒜客 - 蒜头君的任务

    计蒜客 蒜头君的任务 题目描述 蒜头君的上司给蒜头君布置了一个任务,蒜头君维护一个数列,要求提供以下两种操作: 查询操作. 语法:Q L 功能:查询当前数列中末尾 L L L 个数中的最大的数,并输出 ...

最新文章

  1. eureka心跳_Eureka工作原理及心跳机制
  2. 计算机视觉测试数据集 dataset
  3. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。
  4. context:annotation-config/,context:component-scan/,mvc:annotation-driven/区分
  5. python累积和_python – 如何维持累积总和?
  6. python 运算符重载_Python3面向对象-运算符重载
  7. sap采购申请自动转采购订单_SAP idoc功能够强大: 采购订单修改自动触发销售订单修改...
  8. git统计每个人的代码行数_程序员实用工具,推荐一款代码统计神器GitStats
  9. 五、谈扩展方法的理解
  10. 怎样成为一名优秀的运维工程师
  11. WinRAR_v6.01压缩文件包必备软件
  12. php中字符串的截取函数,PHP字符串截取和截取函数的介绍
  13. HTML5期末大作业:饮食企业网站设计——饮品饮料茶(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 HTML静态网页...
  14. 苹果亮度自动调节怎么关闭_找不到“自动亮度调节”?这两个技巧帮你快速更改设置...
  15. 【JAVA】360-2021校招笔试-技术综合A卷-0911
  16. 文件批量搜索器:根据文件名清单查找文件夹内文件移动复制保存
  17. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
  18. 智课雅思词汇---二十五、形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y
  19. 线程池ExecutorService
  20. 签电子合同的流程是怎样的

热门文章

  1. pycharm 用鼠标滑轮控制代码放大缩小的设置
  2. 四、项目计划(华为项目管理法-孙科炎读书摘要)
  3. startx analyze
  4. poi-java导出word的表格中换行
  5. win10注册MSCOMM32控件及简单使用
  6. 易优cms地图文件sitemap生成
  7. PHP导出word文档的简单实现方法(可导出图片)
  8. XTP Python Api 接口编译
  9. 解决群晖 “由于系统可用存储空间不足,您将无法登录“ 的问题
  10. Android使用java和kotlin混合开发时 发现黄油刀BindView失效