Domination

题目链接:https://odzkskevi.qnssl.com/9713ae1d3ff2cc043442f25e9a86814c?v=1531624384

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 chessboard with N rows and M columns.

Every day after work, Edward will place a chess piece on a random empty cell. A few days later, he found the chessboard was dominated by the chess pieces. That means there is at least one chess piece in every row. Also, there is at least one chess piece in every column.

"That's interesting!" Edward said. He wants to know the expectation number of days to make an empty chessboard of N × M dominated. Please write a program to help him.

Input

There are multiple test cases. The first line of input contains an integer Tindicating the number of test cases. For each test case:

There are only two integers N and M (1 <= NM <= 50).

Output

For each test case, output the expectation number of days.

Any solution with a relative or absolute error of at most 10-8 will be accepted.

Sample Input

2
1 3
2 2

Sample Output

3.000000000000
2.666666666667 题意: 给出一个n*m的棋盘,问下棋下到每行每列均有一个棋的情况步数的期望值 思路: 这个数据虽然不大,但是搜索那些肯定是不行的,但是我们又要列出所有的情况,就只能用记忆化搜索,
期望值就是每个步数的概率乘以这个步数之和,所以我们要求出每个步数分别的概率是多少,在这里我们使用三维dp
dp[i][j][k] 代表的是k个棋已经占了i行j列,保证i行并且j列里面都会有一个棋
然后我们想下怎么推导呢想一下,我们每多下一个棋,有四种可能
第一种 多占了一列
第二种 多占了一行
第三种 下在对角线,占一行一列
第四种 下在了之前已经占过的行列上
就可以推导出式子dp[i][j][k]=dp[i][j-1][k-1]+dp[i-1][j][k-1]+dp[i-1][j-1][k-1]+dp[i][j][k-1];
这四种可能的和,但是我下棋的时候每个情况有多少个位置可以下,这里也要求下概率
占一行(意思是这个棋的列要下在之前占过的列的位置,因为要新占一行,所以选的行就是剩下没被占过的数量,然后再除以总的剩下可以下的位置)
其他的以此类推
然后dp数组就存的是概率,我们再去枚举那个占了整个棋盘的概率dp[n][m][i]*i即可
大佬博客:https://blog.csdn.net/cq_pf/article/details/48393897
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double dp[][][*];
int n,m;
void solve()
{
memset(dp,,sizeof(dp));
dp[][][]=1.0;
for(int i=;i<=n;i++)//枚举行
{
for(int j=;j<=m;j++)//枚举列
{
for(int k=;k<=n*m;k++)//枚举下的棋子个数
{
if(i==n&&j==m)//下最后一个棋的时候没有既不占列也不占行的可能性
{
dp[i][j][k]=(dp[i][j-][k-]*(m-j+)*i)/(n*m-k+)+(dp[i-][j][k-]*(n-i+)*j)/(n*m-k+)+
(dp[i-][j-][k-]*(m-j+)*(n-i+))/(n*m-k+);
}
else{
dp[i][j][k]=(dp[i][j-][k-]*(m-j+)*i)/(n*m-k+)+(dp[i-][j][k-]*(n-i+)*j)/(n*m-k+)+
(dp[i-][j-][k-]*(m-j+)*(n-i+))/(n*m-k+)+(dp[i][j][k-]*(j*i-(k-)))/(n*m-k+);
}
}
}
}
double sum=;
for(int i=;i<=n*m;i++)//算期望值
{
sum+=dp[n][m][i]*i;
}
printf("%.12lf\n",sum);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
solve();
}
}

Domination(概率DP)的更多相关文章

  1. ZOJ 3822 Domination 概率dp 难度:0

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  2. zoj 3822 Domination 概率dp 2014牡丹江站D题

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  3. zoj 3822 Domination (概率dp 天数期望)

    题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...

  4. ZOJ 3822 Domination(概率dp 牡丹江现场赛)

    题目链接:problemId=5376">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Edward ...

  5. ZOJ 3822 Domination(概率dp)

    一个n行m列的棋盘,每天可以放一个棋子,问要使得棋盘的每行每列都至少有一个棋子 需要的放棋子天数的期望. dp[i][j][k]表示用了k天棋子共能占领棋盘的i行j列的概率. 他的放置策略是,每放一次 ...

  6. zoj3822 Domination 概率dp --- 2014 ACM-ICPC Asia Mudanjiang Regional Contest

    一个n行m列的棋盘,每次能够放一个棋子.问要使得棋盘的每行每列都至少有一个棋子 须要的放棋子次数的期望. dp[i][j][k]表示用了k个棋子共能占据棋盘的i行j列的概率. 那么对于每一颗棋子,在现 ...

  7. ZOJ3822 ACM-ICPC 2014 亚洲杯赛事现场牡丹江司D称号Domination 可能性DP

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  8. zoj 3822(概率dp)

    ZOJ Problem Set - 3822 Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Ju ...

  9. Codeforces 28C [概率DP]

    /* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...

随机推荐

  1. Confluence 6 应该如何在我的空间中组织内容

    页面和博客 你在 Confluence 中创建的任何内容,从会议记录到回顾和任何中间的内容,不管来源是博客和页面. 你的主页将是任何访问你网站中的用户首先看到的内容.为了让用户更加容易的找到他们需要查 ...

  2. pytorch 中的 split

    Pytorch中的split问题: 1.使用torch.nn.Conv2d中有个参数是groups会将输入的feature map分组,此处需要注意的一点是分组之后各组的feature map的cha ...

  3. redis,memcache二者的区别是?(优缺点)

    Memcache和Redis区别: Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别. Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而M ...

  4. Python遍历文件个文件夹

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法.下面列出: os.path.abspath(path) #返回绝对路径 os.path.basename ...

  5. js字符串转日期兼容性

    今天遇到个bug,安卓上是好的,ios就不行.然后我就把可能用到的值都打印出来,发现日期比较一项在苹果机上就显示false,而谷歌浏览器是true.突然回忆起以前开发遇到过类似的问题,都是出在字符串转 ...

  6. Cassandra的commitLog、memtable、 SStable

    和关系数据库一样,Cassandra在写数据之前,也需要先记录日志,称之为commitlog,然后数据才会写入到Column Family对应的Memtable中,并且Memtable中的内容是按照k ...

  7. Hadoop 2.7.3 完全分布式维护-动态增加datanode篇

    原有环境 http://www.cnblogs.com/ilifeilong/p/7406944.html  IP       host JDK linux hadop role 172.16.101 ...

  8. Segment set(线段并查集)

    Segment set Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total S ...

  9. 更改pip源至国内镜像

    更改pip源至国内镜像   经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样 ...

  10. Qt一步一步实现插件通信(附源码)

      前一章已经实现了主程序调用加载插件功能,这一章描述主程序和插件间通信功能 说道Qt的通信必须要了解信号和槽的机制原理,这里不做论述,不清楚的同学去看看信号和槽机制 不废话直接上步骤,在上一章的基础 ...