热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Domination

Domination题目链接:https:odzkskevi.qnssl.com9713ae1d3ff2cc043442f25e9a86814c?v1531624384题意:t组数
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

题意:t组数据 n*m棋盘,让n行m列都存在一个棋子的时候,定义为n*m的棋盘全部被覆盖。最后求期望

思路:涉及到了概率和期望,当然我们第一时间想到的就是概率DP,开始一直在推算状态转移方程的时候。没有乘上没有出现的次数

例如dp[i-1][j][k-1] 我们应该要写成dp[i]-1][j][k-1]*p*((n-i+1)*j),也就是此前没出现过的数.(p为当前的剩余天数分之一)

最后状态转移方程如下

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

当i==n&&j==m时我们不需要加上dp[i][j][k-1]*(i*j-(k-1))*p;或者我们在求期望的时候 累加 (dp[n][m][i]-dp[n][m][i-1])*i;

最后我们累加dp[n][m[i]*i即可 求出期望;

技术分享图片技术分享图片
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include<set>
#include
using namespace std;
typedef long long ll;
typedef pairint> pll;
#define eps 1e-6
const int INF = 0x3f3f3f3f;
const int maxn = 1000000+5;
const int MOD = 1e9+7;
double dp[55][55][2505];
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                for(int k=1; k<=n*m; k++)
                {
                    double p=1.0/(n*m-k+1);
                    if(i==n&&j==m) 
                    {
                        dp[i][j][k]=dp[i][j-1][k-1]*p*((m-j+1)*i)+dp[i-1][j-1][k-1]*p*((n-i+1)*(m-j+1))+dp[i-1][j][k-1]*p*((n-i+1)*j);
                    }

                    else
                        dp[i][j][k]=dp[i][j-1][k-1]*p*((m-j+1)*i)+dp[i-1][j-1][k-1]*p*((n-i+1)*(m-j+1))+dp[i-1][j][k-1]*p*((n-i+1)*j)+dp[i][j][k-1]*(i*j-(k-1))*p; 
                }
        double sum=0;
        for(int i=1; i<=n*m; i++)
        {
            sum+=dp[n][m][i]*i;
        }
        printf("%.12lf\n",sum);
    }
}
View Code

PS:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~

Domination


推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
author-avatar
衢江大道
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有