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. DataBase -- JOIN

    SQL JOIN:用于根据两个或多个表中列的关系,从这些表中查数据. (为了得到完整数据,我们需要从两个或多个表中获取结果.) 例如W3School中列出的实例,使用如下语句: select Pers ...

  2. maven pom继承与聚合

    一.POM聚合模块: 在分布式架构,分模块化开发中,每个某块可能都是一个单独的maven项目,能够独立的进行项目构架,当模块比较多时,可以使用maven聚合聚合项目来简化maven构建,一次构建多个项 ...

  3. The 13th Zhejiang Provincial Collegiate Programming Contest - C

    Defuse the Bomb Time Limit: 2 Seconds      Memory Limit: 65536 KB The bomb is about to explode! Plea ...

  4. Ubuntu14.04 换源 阿里云

    sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup sudo vim /etc/apt/sources.list sudo apt-g ...

  5. bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

  6. TCP ------ TCP创建服务器中出现的套接字

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...

  7. socket编程 ------ BSD socket API

    伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...

  8. Android布局优化思考

    一.关于RelativeLayout和LinearLayout的使用 由源码可以知道,RelativeLayout需要对其子View进行两次measure过程,而LinearLayout只需一次mea ...

  9. Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询

    有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中. ...

  10. 51Nod 1081前缀和

    #include <iostream> #include <stdio.h> using namespace std; ]; ]; int main() { int n; ci ...