博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3822 Domination DP
阅读量:4634 次
发布时间:2019-06-09

本文共 1306 字,大约阅读时间需要 4 分钟。

状态i,j,k为已经有i行,j列放满,放了k个棋子的概率,转移分四种情况(只增加行,只增加列,行列都增加,行列都不增加)讨论即可。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MP make_pair#define PB push_backtypedef long long LL;typedef unsigned long long ULL;typedef vector
VI;typedef pair
PII;typedef pair
PDD;const int INF = INT_MAX / 3;const double eps = 1e-8;const LL LINF = 1e17;const double DINF = 1e60;const int maxn = 60;double f[maxn][maxn][maxn * maxn];bool vis[maxn][maxn][maxn * maxn];int n, m;double dfs(int i, int j, int k) { int pi = n - i, pj = m - j; if(i < 0 || j < 0 || k > pi * pj) return 0; if(i == 0 && j == 0) return k; if(i == n && j == m) return dfs(i - 1, j - 1, k + 1); if(vis[i][j][k]) return f[i][j][k]; double rest = n * m - k; double ret = dfs(i - 1, j - 1, k + 1) * i * j / rest + dfs(i, j, k + 1) * (pi * pj - k) / rest + dfs(i - 1, j, k + 1) * pj * i / rest + dfs(i, j - 1, k + 1) * pi * j / rest; vis[i][j][k] = true; return f[i][j][k] = ret;}int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &m); memset(vis, 0, sizeof(vis)); printf("%.13f\n", dfs(n, m, 0)); } return 0;}

 

转载于:https://www.cnblogs.com/rolight/p/4031906.html

你可能感兴趣的文章
centos7下安装docker
查看>>
推荐一个MacOS苹果电脑系统解压缩软件
查看>>
命令行编译运行CSharp文件
查看>>
HDOJ 1060 Leftmost Digit
查看>>
1035等差数列末项计算
查看>>
ASP.NET MVC 2示例Tailspin Travel
查看>>
nonatomic, retain,weak,strong用法详解
查看>>
第10周进度条
查看>>
编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。...
查看>>
CDMA鉴权
查看>>
ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
查看>>
#include<bits/stdc++.h>包含C++的所有头文件
查看>>
Vue插槽 slot
查看>>
软考之路-网络攻击:主动攻击和被动攻击
查看>>
《windows核心编程系列》二谈谈ANSI和Unicode字符集
查看>>
知识图谱学习笔记(1)
查看>>
第三方原理
查看>>
同意好友
查看>>
随机映射
查看>>
servlet对mysql数据库的数据增删改
查看>>