Solution

场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\)列的情况, 我naive地认为一个状态要么不出现, 要么只出现一次. 于是用\(f[i][j]\)来表示出现的概率, 直接进行DP. 然后我用随机函数对拍, 发现是WA的...

考虑问题出现在了哪里: 一个状态实际上是可以出现多次的. 比如说我们考虑分别控制了两行两列的状态: 两行两列产生4个交点, 这4个交点中可以有2个, 3个, 4个棋子. 因此我们发现还要多记录一维, 表示用了多少个棋子.

我们用\(f[x][i][j]\)表示用了\(x\)个棋子, 控制了\(i\)行\(j\)列的状态的出现概率.
\[ \begin{aligned} f[x][i][j] = &f[x - 1][i - 1][j - 1] \times \frac{mn - (i - 1)m - (j - 1)n + (i - 1)(j - 1)}{mn - (x - 1)} \\ &+ f[x - 1][i - 1][j] \times \frac{j \times (n - (i - 1))}{mn - (x - 1)} \\ &+ f[x - 1][i][j - 1] \times \frac{i \times (m - (j - 1))}{mn - (x - 1)} \\ &+ f[x - 1][i][j] \times \frac{i \times j - (x - 1)}{mn - (x - 1)} \end{aligned} \]
考虑如何统计答
\[ ans = \sum_x f[x][i][j] \times x \]
同时我们注意到这个式子还不完全是对的: \(f[x - 1][n][m]\)不能用于继续转移.

因此我们在\(f[x][n][m]\)上直接减去\(f[x - 1][n][m]\)即可.

#include <cstdio>
#include <cstring>const int N = 50, M = 50;
double f[N * M + 1][N + 1][M + 1];
int main()
{int cs; scanf("%d", &cs);while(cs --){int n, m; scanf("%d%d", &n, &m);memset(f, 0, sizeof(f));f[0][0][0] = 1;for(int x = 1; x <= n * m; ++ x){for(int i = 1; i <= n; ++ i)for(int j = 1; j <= m; ++ j)f[x][i][j] = f[x - 1][i - 1][j - 1] * (m * n - (i - 1) * m - (j - 1) * n + (i - 1) * (j - 1)) / (m * n - (x - 1))+ f[x - 1][i - 1][j] * (j * (n - (i - 1))) / (m * n - (x - 1))+ f[x - 1][i][j - 1] * (i * (m - (j - 1))) / (n * m - (x - 1))+ f[x - 1][i][j] * (i * j - (x - 1)) / (m * n - (x - 1));f[x][n][m] -= f[x - 1][n][m];}double ans = 0;for(int i = 1; i <= n * m; ++ i) ans += i * f[i][n][m];printf("%.10lf\n", ans);}
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/7515953.html

2016集训测试赛(二十四)Problem C: 棋盘控制相关推荐

  1. [补档]noip2019集训测试赛(十四)

    Problem A: Fibonacci(fib.pas/cpp) Time Limit: 1000 ms Memory Limit: 128 MB Description 豆豆最近迷上了Fibona ...

  2. 2016集训测试赛(二十四)Problem B: Prz

    Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\( ...

  3. 2016集训测试赛(二十六)Problem A: bar

    Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么 ...

  4. [补档]noip2019集训测试赛(十二)

    Problem A: 记忆(memory) Time Limit: 1000 ms Memory Limit: 512 MB Description 你在跟朋友玩一个记忆游戏. 朋友首先给你看了n个长 ...

  5. 2016北京集训测试赛(十三) Problem B: 网络战争

    Solution KD tree + 最小割树 转载于:https://www.cnblogs.com/ZeonfaiHo/p/7420354.html

  6. 2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡

    Solution 我们发现, 对于一条路径来说, 花费总时间为\(ap + q\), 其中\(p\)和\(q\)为定值. 对于每个点, 我们有多条路径可以到达, 因此对于每个区间中的\(a\)我们可以 ...

  7. verilog for循环_HDLBits:在线学习 Verilog (二十四 · Problem 115-119)

    本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同 ...

  8. [补档]noip2019集训测试赛(十五)

    Problem A: 传送带 Time Limit: 1000 ms Memory Limit: 256 MB Description 在一个二维平面上有两条传送带,每一条传送带可以看成是一条线段.两 ...

  9. [补档]noip2019集训测试赛(十)

    Problem A: fibonacci Time Limit: 2000 ms Memory Limit: 256 MB Description 小y最近迷上了fibonacci数列,他定义了一种数 ...

最新文章

  1. 不懂SOLID,GRASP这些软件开发原则!写出来的代码都是垃圾!
  2. sysbench-系统、数据库压力测试工具
  3. android找工作 2019,2019年真的很难找工作吗?
  4. Anaconda:包安装以XGBoost为例
  5. Java 图形用户界面(GUI)java.awt包概述
  6. python骂人的程序_Python实现敏感词过滤的4种方法
  7. nodeJs的学习之路(1)
  8. __attribute__((regparm(number))):函数通过number个寄存器传递参数,否则通过堆栈
  9. mysql 视图锁_Oracle数据库的锁类型及相关视图
  10. nginx server_name
  11. 一文彻底明白linux中的selinux到底是什么
  12. SmtpClient SSL 发送邮件异常排查
  13. 如何删除2345浏览器网络导航主页
  14. 虚拟机非正常关闭,里面的服务器重启报错:Error, some other host already uses address...
  15. Adobe Photoshop Lightroom Classic 中文版
  16. Maven下载、安装与配置
  17. PPT分享:基于Eventuate平台解决微服务架构难题
  18. 产品3周迭代一次,启信宝驾驭8000万企业征信的平台架构
  19. 少女心多功能便签本,少女心便签软件办公版
  20. UNIX编程学习——more指令实现

热门文章

  1. HR问我为什么要离开上一家公司钱没给到位,心委屈了。这些归根到底就一条:干得不爽。
  2. 举牌人表情包使用nodejs实现
  3. 事态升级是什么意思_俗语“头不顶桑脚不踩槐;生不睡柳死不睡杨”啥意思 有道理吗...
  4. python成绩转换_Python格式化输出%与format能不能互相转换?
  5. 系统快捷方式java_java中这么创建界面快捷方式图标 代码
  6. java类初始化_Java的类/实例初始化过程
  7. 各层电子数排布规则_核外电子的排布规律
  8. linux trac svn,Ubuntu安装Trac SVN的方法及命令
  9. 鸿蒙有没有手机管家,鸿蒙2.0手机快了,华为EMUI 11透露关键信息
  10. phalcon index.php,Phalcon环境搭建与项目开发