hdu6052

题意

给出一个 \(n * m\) 的网格矩阵,每个格子都有颜色,随机选出一个子矩阵,问颜色种数的期望。

分析

那么我们可以去算所有矩阵的颜色种数之和,也就是每种颜色出现过的矩阵的个数之和,除以子矩阵的个数就是答案。

为了避免重复,我们要规定哪些矩阵属于某个格子。如果一些格子颜色为 \(1\) ,矩阵 \(A\) 中所有颜色为 \(1\) 的格子中,按从左到右,从上到下的顺序,一定有一个格子 \(a\) 在前,我们把这个矩阵 \(A\) 叫做(归为) \(a\) 的子矩阵。(某个子矩阵属于那个格子,是针对那个格子的颜色以及子矩阵中具有相同颜色的格子而言)

计算每种颜色在多少个子矩阵中出现过,直接去枚举矩阵,枚举到某一个格子时,它的下边界一定是 \(n\) ,上边界先设为当前行,在没有改变上边界的情况下,右边界为 \(m\) ,向左寻找,如果不存在相同颜色的格子,那么左边界为 \(1\) ,计算包含这个格子的矩阵数量(边界的意思是边界里的格子都能用)。

然后上边界不断上移,更新左右边界的值。

code

  1. #include<bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. const int MAXN = 1e2 + 10;
  5. int n, m;
  6. int c[MAXN][MAXN];
  7. ll fun(int x, int y) {
  8. ll sum = 0;
  9. int L = 1, R = m;
  10. for(int i = x; i >= 1; i--) {
  11. if(i != x && c[i][y] == c[x][y]) break;
  12. int l = 1, r = m;
  13. for(int j = y - 1; j >= 1; j--) {
  14. if(c[i][j] == c[x][y]) {
  15. l = j + 1;
  16. break;
  17. }
  18. }
  19. if(i != x) {
  20. for(int j = y + 1; j <= R; j++) {
  21. if(c[i][j] == c[x][y]) {
  22. r = j - 1;
  23. break;
  24. }
  25. }
  26. }
  27. L = max(L, l);
  28. R = min(R, r);
  29. sum += 1LL * (y - L + 1) * (R - y + 1) * (n - x + 1);
  30. }
  31. return sum;
  32. }
  33. int main() {
  34. int T;
  35. scanf("%d", &T);
  36. while(T--) {
  37. scanf("%d%d", &n, &m);
  38. for(int i = 1; i <= n; i++) {
  39. for(int j = 1; j <= m; j++) {
  40. scanf("%d", &c[i][j]);
  41. }
  42. }
  43. ll sum = 0, num = 0;
  44. for(int i = 1; i <= n; i++) {
  45. for(int j = 1; j <= m; j++) {
  46. sum += 1LL * (n - i + 1) * (m - j + 1);
  47. num += fun(i, j);
  48. }
  49. }
  50. printf("%.9f\n", 1.0 * num / sum);
  51. }
  52. return 0;
  53. }

hdu6052的更多相关文章

随机推荐

  1. 用HTML5 Canvas做一个画图板

    使用HTML5可以非常简单地在canvas上实现画图应用,用支持html5的浏览器便可在下面的区域进行绘画,要看到演示效果,请确保你的浏览器支持HTML5: 功能很简单,原理其实和拖放是类似的,主要是 ...

  2. Vim使用小记(二)插件管理

    By francis_hao    Mar 8,2017 Vundle Vundle,全称为Vim bundle,是一个插件管理器.可以对vim插件进行安装和卸载. Vundle的安装方法看这里[参考 ...

  3. MySQL使用笔记(六)条件数据记录查询

    By francis_hao    Dec 17,2016 条件数据记录查询 mysql> select field1,field2-- from table_name where 条件; 其中 ...

  4. 两个神奇的函数~~~sscanf、atoi

    sscanf 对你没有看错 多了一个s 这个函数有什么作用呢 功能:读取字符串中的int.double.long.long long .float and so on 类型的数据 譬如说 我现在读入了 ...

  5. java JDK动态代理的机制

    一:前言 自己在稳固spring的一些特性的时候在网上看到了遮掩的一句话“利用接口的方式,spring aop将默认通过JDK的动态代理来实现代理类,不适用接口时spring aop将使用通过cgli ...

  6. [POI2014] KUR-Couriers(洛谷P3567)

    洛谷题目链接:[POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. Th ...

  7. 游戏中的过程生成——元胞自动机 Celluar Automata 生成洞穴地形

    最近在学习过程生成技术,在这里写一些心得. 对于元胞自动机,我们这里只讨论输入是一副二维bool数组的情况,即大多数游戏中的情况. 一个元胞自动机,对于一个输入,给出一个同样格式的输出.输出中的每个点 ...

  8. HDU 1798 Tell me the area (数学)

    题目链接 Problem Description     There are two circles in the plane (shown in the below picture), there ...

  9. javascript的阻塞机制

    javascript的阻塞机制 浏览器在执行javascript代码时,不能同时做其它事情,当遇到javascript时,浏览器会下载js文件,解析并执行该文件,而在这期间页面的渲染是完全被阻塞的,因 ...

  10. MySQL 查询语句练习2

    创建表 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50719 Sour ...