ZOJ Problem Set - 3822Domination(DP)

problemCode=3822">题目链接

题目大意:
给你一个n * m的棋盘,每天都在棋盘上面放一颗棋子。直到这个棋盘上的每行每列都有至少有一颗棋子。求要用的天数的期望。

解题思路:
        先求出不同摆法的棋盘的概率,然后在和天数相乘就是期望。

        我们将棋盘划分为四个部分:当中一部分为每行没列都至少有一个棋子。

        然后得出状态转移方程:
        dp[x][y][k]:表示x行y列已经满足要求,用了k个棋子。
        dp[x][y][k + 1] = dp[x][y][k] *(x *y - k)/ (m * n - k);
        dp[x][y][k + 1] = dp[x - 1][y][k] * (n - x + 1) * y / (n * m - k);
        dp[x][y][k + 1] = dp[x][y - 1][k] * (m - y + 1) *x / (n *m - k);
        dp[x][y][k + 1] = dp[x - 1][y - 1][k] *(m - y + 1) *(n - x + 1) / (n * m - k);
        dp[0][0][0] = 1;而且dp[n][m][k] -= dp[n][m][k - 1].由于这个时候已经按要求覆盖了整个棋盘。可是再下第k颗棋子的时候,是有前面的k - 1颗棋子的总数来决定的。可是到k - 1的时候事实上就是能够停止的,而之前这个种类已经加过了,所以减掉。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn = 55; double dp[maxn][maxn][maxn * maxn]; int main () { int T;
int n, m; scanf ("%d", &T);
while (T--) { dp[0][0][0] = 1; scanf ("%d%d", &n, &m); for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int k = 0; k < i * j; k++) { dp[i][j][k + 1] = 0;
dp[i][j][k + 1] += dp[i][j][k] * (i * j - k) / (n * m - k);
//printf ("%.12lf\n", dp[i][j][k + 1]);
if (i)
dp[i][j][k + 1] += dp[i - 1][j][k] * (n - i + 1) * j/ (n * m - k);
if (j)
dp[i][j][k + 1] += dp[i][j - 1][k] * (i * (m - j + 1)) / (n * m - k);
if (i && j)
dp[i][j][k + 1] += dp[i - 1][j - 1][k] * (n - i + 1) * (m - j + 1) / (n * m - k);
} double ans = max(n, m) * dp[n][m][max(n, m)];
for (int k = max(n, m) + 1; k <= n * m; k++)
ans += k * (dp[n][m][k] - dp[n][m][k - 1]); printf ("%.12lf\n", ans);
}
return 0;
}

最新文章

  1. ES6 新特性
  2. 第一章-第五题(你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。)--By 侯伟婷
  3. python——SQL基本使用
  4. MVC 请求处理流程(二)
  5. 跟我一起学WCF(9)——WCF回调操作的实现
  6. BZOJ 1051 受欢迎的牛(Tarjan缩点)
  7. Canopy算法聚类
  8. hdu4940 Destroy Transportation system(2014多校联合第七场)
  9. (转)经典收藏 50个jQuery Mobile开发技巧集萃
  10. vim插件之SnipMate
  11. Unity学习笔记(一)——基本概念之场景(Scene)
  12. opennebula 自定义安装目录
  13. vim设置
  14. 实现html元素跟随touchmove事件的event.touches[0].clientX移动
  15. [OpenJudge] 百练2754 八皇后
  16. Infragistics的介绍以及在ASP.net中使用的总结
  17. java abs(绝对值) , max(最大值),min(最小值) 方法的应用
  18. 微信浏览器安卓手机video浮在最上层问题
  19. redis学习(二)——String数据类型
  20. C语言访问一个链接

热门文章

  1. 冒泡,简单选择,直接插入排序(Java版)
  2. caffe 训练測试自己的数据集
  3. 深入理解cookie与session
  4. vim 插件之solarized
  5. mDNS原理的简单理解——每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少
  6. Git-如何将已存在的项目提交到git
  7. Android项目实战(五十六):获取WebView加载的url的请求错误码
  8. vue实现文字上下滚动
  9. zookeeper 性能测试
  10. java 处理word文档 (含图片,表格内容)