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. Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...

  2. python -- configparse读取配置文件

    在开发过程中,有的时候需要将一些参数写入到配置文件中,这样在改动一些相关信息时,可以直接在配置文件中进行修改. 而在python中,可以通过内置模块configparse对标准的配置文件进行读取. 配 ...

  3. Ajax全解析

    什么是Ajax Ajax基本概念 Ajax(Asynchronous JavaScript and XML):翻译成中文就是异步的JavaScript和XML. 从功能上来看是一种在无需重新加载整个网 ...

  4. hive-pom.xml

    4.0.0 <groupId>com.cenzhongman</groupId> <artifactId>hive</artifactId> <v ...

  5. 生成heap dump

    在查看内存泄露以及对内存问题中,要dump出当前内存堆存储快照,便于分析.有几种方法可以做,简介如下 一.intellij IDEA 由于我用的是intellij IDEA,所以没有介绍Eclipse ...

  6. 15.3,redis持久化RDB与AOF

    redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久化 ...

  7. WPF仿酷狗页面

    原文:WPF仿酷狗页面 版权声明:本文为博主原创文章,如需转载请标明转载地址 http://blog.csdn.net/u013981858 https://blog.csdn.net/u013981 ...

  8. 7 定制10MINs首页2

    1.添加 <div class="ui basic segment"> <h1 class="ui center aligned header" ...

  9. IOS测试,打不开要测试的APP怎么办?设置信任

    步骤:设置-->通用-->设备管理-->企业级应用-->信任 具体教程:http://jingyan.baidu.com/article/ab69b27085ab002ca71 ...

  10. JavaScript简易学习笔记

    学习地址:http://www.w3school.com.cn/js/index.asp 文字版: https://github.com/songzhenhua/github/blob/master/ ...