zoj 3822 Domination (可能性DP)

zoj 3822 Domination (可能性DP)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。


Domination



Time Limit: 8 Seconds      
Memory Limit: 131072 KB      
Special Judge


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 Mcolumns.

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 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的棋盘里随机放棋子,每天往一个格子里放一个。求每一行每一列都有棋子覆盖的天数。

思路:开一个三维数组,dp[i][j][k]:有i行j列被k个棋子覆盖的概率。

则dp[i+1][j][k+1]=dp[i][j][k]*(n-i)*j/(n*m-k);      

//添加一个棋子,多覆盖一行

dp[i][j+1][k+1]=dp[i][j][k]*i*(m-j)/(n*m-k);        

//添加一个棋子,多覆盖一列

dp[i+1][j+1][k+1]=dp[i][j][k]*(n-i)*(m-j)/(n*m-k);  

//添加一个棋子,多覆盖一行及一列

dp[i][j][k+1]=dp[i][j][k]*(i*j-k)/(n*m-k);    

//添加一个棋子,行、列数没有添加

则ans=dp[n][m][k]*k,(k=0…n*m). //当i==n&&j==m时特殊处理,最后一项去掉。

易知dp[0][0][0]=1;

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 55
#define LL __int64
const int inf=0x1f1f1f1f;
const double eps=1e-10;
double dp[N][N][N*N];
int n,m;
void inti()
{
    int i,j,k;
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=m;j++)
        {
            for(k=0;k<=n*m;k++)
                dp[i][j][k]=0;
        }
    }
}
int main()
{
    int i,j,k,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        inti();
        dp[0][0][0]=1;
        int tt=n*m;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(k=0;k<=n*m;k++)
                {
                    if(i==n&&j==m)
                        dp[i][j][k]=(dp[i-1][j][k-1]*(n-i+1)*j+dp[i][j-1][k-1]*i*(m-j+1)+dp[i-1][j-1][k-1]*(n-i+1)*(m-j+1))/(tt-k+1);
                    else
                        dp[i][j][k]=(dp[i-1][j][k-1]*(n-i+1)*j+dp[i][j-1][k-1]*i*(m-j+1)+dp[i-1][j-1][k-1]*(n-i+1)*(m-j+1)+dp[i][j][k-1]*(i*j-k+1))/(tt-k+1);
                }
            }
        }
        double ans=0;
        for(i=0;i<=tt;i++)
            ans+=dp[n][m][i]*i;
        printf("%.9f\n",ans);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117891.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月16日 下午11:00
下一篇 2021年12月17日 上午6:00


相关推荐

  • pb数据库连接_jdbc连接mysql中文乱码

    pb数据库连接_jdbc连接mysql中文乱码最近需要用pb联mysql做个项目,查网上有关的方法,很多都没说清楚,所以在这里总结下:  采用JDBC连接,首先去MYSQL官网下载mysql-connector-java-5.0.7.rar JDBC驱动打开PB,菜单Tools–>systemoptions,打开JAVA选项,点击新增文件(白色文件图标)选择刚解压的mysql-connector-java

    2025年10月10日
    6
  • 大数据:简述对数据采集平台的认识

    大数据:简述对数据采集平台的认识大数据 简述对数据采集平台的认识一 数据采集平台的认识任何完整的大数据平台 一般包括以下的几个过程 amp nbsp amp nbsp amp nbsp amp nbsp amp nbsp amp nbsp 数据采集 amp gt 数据存储 amp gt 数据处理 amp am

    2026年3月18日
    2
  • python灰度图生成g代码_tcam2009利用灰度图生成雕刻机所需的G代码

    python灰度图生成g代码_tcam2009利用灰度图生成雕刻机所需的G代码双击桌面的artcam快捷方式图标打开软件首先看到如下的界面。点击“通过图像产生模型”利用ARTCAM软件制作浮雕刀路的方法Artcam2009利用灰度图生成雕刻机所需的G代码1、打开Artcam2009(其它版本的也可以),选择文件菜单下新的通过图像文件载入一个灰度图。2、找到你要编辑的灰度图,选择打开。3、设置工件原点(这里选择的是中心,你也可以选择其它的位置),单位选择…

    2022年6月20日
    31
  • linux busybox安装,busybox的编译、使用及安装

    linux busybox安装,busybox的编译、使用及安装busybox是什么?(1)busybox是Linux上的一个应用程序(application),即只有一个ELF文件头。(2)它整合了许多Linux上常用的工具和命令(utilities),如rm,ls,gzip,tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。(3)busybox的官方网站…

    2022年7月25日
    31
  • deepin自带wine使用方法_ubuntu安装deepin桌面环境

    deepin自带wine使用方法_ubuntu安装deepin桌面环境腾讯从19年10月底启用了ipv6技术,接收图片和显示头像需要连接到ipv6地址,然而某些地区运营商的ipv6服务不稳定,这就导致在deepin上QQ加载不了图片和表情。因此,禁用ipv6即可解决该问题,操作如下。1.打开终端(Ctrl+Alt+T)2.输入命令:$sudogedit/etc/sysctl.conf3.在打开的文档末尾添加如下代码:#IPv6disablednet.ipv6.conf.all.disable_ipv6=1net.ipv6.conf.default

    2022年8月10日
    8
  • 安卓drawable图片路径_安卓drawable添加图片

    安卓drawable图片路径_安卓drawable添加图片Android图片放对应的drawable文件夹

    2022年4月21日
    118

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号