E - Domination

Time Limit:8000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Submit Status

Description

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 dominatedby 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 T indicating 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列的棋盘,每次可以放一个棋子,问要使得棋盘的每行每列都至少有一个棋子 需要的放棋子次数的期望。

那么对于每一颗棋子,在现有的棋盘上,它可能有四种影响:新占了一行,新占了一列,既占了新的一行又占了新的一列,无影响。

注意这里的无影响指的不是下在同一个位置,这是不允许的,指的是已有(1,2),(2,1),下在(1,1)无影响,不增加行和列。

题解一:

dp[i][j][k]  已经占据i行j列,走了k步的时候,还需要走的步数的期望。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
double dp[][][*];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,,sizeof(dp));
for(int i=n;i>=;i--)
for(int j=m;j>=;j--)
for(int k=i*j;k>=max(i,j);k--)
{
if(i==n&&j==m)
continue;
dp[i][j][k]+=1.0*(n-i)*j/(1.0*n*m-k)*dp[i+][j][k+];
dp[i][j][k]+=1.0*i*(m-j)/(1.0*n*m-k)*dp[i][j+][k+];
dp[i][j][k]+=1.0*(n-i)*(m-j)/(1.0*n*m-k)*dp[i+][j+][k+];
dp[i][j][k]+=1.0*(i*j-k)/(1.0*n*m-k)*dp[i][j][k+];
dp[i][j][k]+=1.0;
}
printf("%.12lf\n",dp[][][]);
}
}

题解二:

dp[i][j][k]表示用了k个棋子共能占领棋盘的i行j列的概率。

所以用dp[i][j][k]-dp[i][j][k-1]得到是第k个棋子恰好使得每行每列都占领的概率。

#include<cstdio>
#include<cstring>
double dp[][][];
int n,m;
int main()
{
int T,i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int sum=n*m;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
for(k=;k<=sum;k++) dp[i][j][k]=;
dp[][][]=1.0;
for(k=;k<=sum;k++)
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
dp[i][j][k]+=(dp[i][j][k-]*(i*j-k+)*1.0/(sum-k+));//添加的位置没有新增新行或新列
dp[i][j][k]+=(dp[i-][j][k-]*((n-i+)*j)*1.0/(sum-k+));//增加行不增加列
dp[i][j][k]+=(dp[i][j-][k-]*(m-j+)*i*1.0/(sum-k+));//增加列不增加行
dp[i][j][k]+=(dp[i-][j-][k-]*(n-i+)*(m-j+)*1.0/(sum-k+));//既增加列也增加行
// printf("i:%d j;%d k;%d dp:%lf\n",i,j,k,dp[i][j][k]);
}
double ans=;
for(k=;k<=sum;k++) ans+=(dp[n][m][k]-dp[n][m][k-])*k;
printf("%.10lf\n",ans);
}
return ;
}

ZOJ 3822 Domination (三维概率DP)的更多相关文章

  1. zoj 3822 Domination(dp)

    题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...

  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 难度:0

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

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

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

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

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

  6. Domination(概率DP)

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

  7. zoj 3822 Domination(2014牡丹江区域赛D称号)

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

  8. zoj 3822 Domination(2014牡丹江区域赛D题) (概率dp)

    3799567 2014-10-14 10:13:59                                                                     Acce ...

  9. ZOJ 3822 Domination(概率dp)

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

随机推荐

  1. C# 不同窗口传递参数

    form1: private void button1_Click(object sender, System.EventArgs e) { Form2 frm = new Form2(); frm. ...

  2. POJ:2010-Moo University - Financial Aid

    Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10894 Acce ...

  3. IDA 对 SO 的逆向

    ApkTool对apk进行解包,在解包后的lib目录中找到so文件 so文件大概有以下几种 armeabi: 第5代.第6代的ARM处理器,早期的手机用的比较多. armeabiv-v7a:第7代及以 ...

  4. spark中的RDD以及DAG

    今天,我们就先聊一下spark中的DAG以及RDD的相关的内容 1.DAG:有向无环图:有方向,无闭环,代表着数据的流向,这个DAG的边界则是Action方法的执行 2.如何将DAG切分stage,s ...

  5. 资料--JavaScript原型链

    JavaScript原型链 原文出处:https://www.cnblogs.com/chengzp/p/prototype.html 目录 创建对象有几种方法 原型.构造函数.实例.原型链 inst ...

  6. Result Maps collection does not contain value for XXXXX

    在做mybatis多表查询的时候,出现了下面的错误: java.lang.IllegalArgumentException: Result Maps collection does not conta ...

  7. atomic integer 实现

    public final int getAndAddInt(Object o, long offset, int delta) { int v; do { v = getIntVolatile(o, ...

  8. Linux编译安装与配置-MySQL(5.5,5.6)版本系(笔记)

    MySQL 5.5(5.6)后版本,需要使用cmake(Cross make , https://cmake.org/ )编译 我的环境如下: VMWare虚拟机,CentOS 5.5 x86_64( ...

  9. 一个初学者的辛酸路程-前端cs

    一.主要内容 继续CSS 二.CSS 第一个: postion 网页有一类就是返回顶部,一直在右下角,还有打开一个网页顶部有个菜单,滚动滑轮,顶部永远在上面. position:  fiexd  == ...

  10. os--留

    os.path.abspath(path) #返回绝对路径    绝对路径和文件路径的区别,绝对路径是当前在操作文本的路径,文件路径是当前文本的文件的路径 os.path.basename(path) ...