题目链接:传送门

题目大意:

  给出N*M的字符矩阵(由字符B/R组成),求符合下图条件的子矩阵的最大周长。

  1 ≤ N,M ≤ 1000。

思路:

  悬线法。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6. const int MAX_N = 1e3 + ;
  7.  
  8. int N, M;
  9. char mat[MAX_N][MAX_N];
  10. int lef[MAX_N][MAX_N], rig[MAX_N][MAX_N], up[MAX_N][MAX_N];
  11.  
  12. void init1()
  13. {
  14. for (int i = ; i <= N; i++) {
  15. for (int j = ; j <= M; j++)
  16. if (j > && mat[i][j] == mat[i][j-])
  17. lef[i][j] = lef[i][j-] + ;
  18. else
  19. lef[i][j] = ;
  20. for (int j = M; j >= ; j--)
  21. if (j < M && mat[i][j] == mat[i][j+])
  22. rig[i][j] = rig[i][j+] + ;
  23. else
  24. rig[i][j] = ;
  25. }
  26. }
  27.  
  28. void init2()
  29. {
  30. for (int i = ; i <= N; i++) {
  31. for (int j = ; j <= M; j++)
  32. if (j > && mat[i][j] != mat[i][j-])
  33. lef[i][j] = lef[i][j-] + ;
  34. else
  35. lef[i][j] = ;
  36. for (int j = M; j >= ; j--)
  37. if (j < M && mat[i][j] != mat[i][j+])
  38. rig[i][j] = rig[i][j+] + ;
  39. else
  40. rig[i][j] = ;
  41. }
  42. }
  43.  
  44. int dp1()
  45. {
  46. int ans = ;
  47. for (int i = ; i <= N; i++) {
  48. for (int j = ; j <= M; j++) {
  49. if (i > && mat[i][j] == mat[i-][j]) {
  50. up[i][j] = up[i-][j] + ;
  51. lef[i][j] = min(lef[i][j], lef[i-][j]);
  52. rig[i][j] = min(rig[i][j], rig[i-][j]);
  53. }
  54. else
  55. up[i][j] = ;
  56. int len = lef[i][j] + rig[i][j] - ;
  57. int high = up[i][j];
  58. ans = max(ans, *len+*high);
  59. }
  60. }
  61. return ans;
  62. }
  63.  
  64. int dp2()
  65. {
  66. int ans = ;
  67. for (int i = ; i <= N; i++) {
  68. for (int j = ; j <= M; j++) {
  69. if (i > && mat[i][j] != mat[i-][j]) {
  70. up[i][j] = up[i-][j] + ;
  71. lef[i][j] = min(lef[i][j], lef[i-][j]);
  72. rig[i][j] = min(rig[i][j], rig[i-][j]);
  73. }
  74. else
  75. up[i][j] = ;
  76. int len = lef[i][j] + rig[i][j] - ;
  77. int high = up[i][j];
  78. ans = max(ans, *len + *high);
  79. }
  80. }
  81. return ans;
  82. }
  83.  
  84. int main()
  85. {
  86. int T;
  87. int kase = ;
  88. cin >> T;
  89. while (T--) {
  90. cin >> N >> M;
  91. for (int i = ; i <= N; i++)
  92. for (int j = ; j <= M; j++)
  93. cin >> mat[i][j];
  94. int ans = ;
  95. init1();
  96. ans = max(ans, dp1());
  97. init2();
  98. ans = max(ans, dp2());
  99. printf("Case #%d: %d\n", kase++, ans);
  100. }
  101. return ;
  102. }
  103. /*
  104. 2
  105. 3 3
  106. BBR
  107. RBB
  108. BBB
  109. 1 1
  110. B
  111. */

HDU4328 Cut the cake(动规:最大子矩形问题/悬线法)的更多相关文章

  1. 洛谷P4147 玉蟾宫(动规:最大子矩形问题/悬线法)

    题目链接:传送门 题目大意: 求由F构成的最大子矩阵的面积.输出面积的三倍. 1 ≤ N,M ≤ 1000. 思路: 悬线法模板题. #include <bits/stdc++.h> us ...

  2. hdu4328(经典dp用悬线法求最大子矩形)

    http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...

  3. HDU 4328 Cut the cake

    Cut the cake Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. vijos1431[noip2007]守望者的逃离(背包动规)

    描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者 在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这 个荒岛施咒,这座岛很快就会 ...

  5. HDU 4762 Cut the Cake(公式)

    Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组

    花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...

  7. 区间型动规--石子归并(Pascal)

    题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...

  8. Cut the Cake(大数相乘)

      MMM got a big big big cake, and invited all her M friends to eat the cake together. Surprisingly o ...

  9. 【noip 2009】 乌龟棋 记忆化搜索&动规

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

随机推荐

  1. How to import a GitHub project into Eclipse

    Assuming you have created a project in GitHub, these are the steps to import it into Eclipse. First, ...

  2. vue-cli webpack全局引入jquery

    1.首先在package.json里加入, dependencies:{ "jquery" : "^2.2.3" } 2.安装依赖 npm install jq ...

  3. Linux 控制CPU使用率

    曾经看过<编程之美>上提到说使 CPU的使用率固定在百分之多少.然后这次刚好要用到这个东西,下面是一个简单的实现.基于多线程: Linux 版本: #include <iostrea ...

  4. linux下free命令详解

    free 命令显示系统内存的使用情况,包括物理内存.交换内存(swap)和内核缓冲区内存. 如果加上 -h 选项,输出的结果会友好很多: 有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指 ...

  5. learning scala output to console

    控制台输出语句: print println example: scala> print("i=");print(i)i=345scala> println(" ...

  6. Uva LV 2995 Image Is Everything 模拟,坐标映射,视图映射 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. Django ajax提交 登录

    一.url from django.contrib import adminfrom django.urls import pathfrom appo1 import views urlpattern ...

  8. json 2017-04-21 10 17

    jo := SO(); jo.S['tttt'] := 'tttt'; TbSendedTidJson['jo'] := jo; ja := TbSendedTidJson['jo'];//取出来后, ...

  9. Cracking The Coding Interview 9.6

    //原文: // // Given a matrix in which each row and each column is sorted, write a method to find an el ...

  10. Java流对象理解

    马士兵老师,曾在Java的学习过程中,将Java的流比作管道,认为很贴切,在此笔者也建议读者在学习过程中作类似比喻,形象化的学习 Java根据数据流向的不同分为输入流和输出流: Java根据处理数据类 ...