zoukankan      html  css  js  c++  java
  • HDU 2870 Largest Submatrix

    这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版

    如果按照上面由简到易的顺序来做的话,还是很简单的

    这道题的思想就是 枚举+DP

    因为某些字符可以变值,所以我们枚举a, b, c三个矩阵

    分别求出对应的h数组以及最大子矩阵,再在里面求出一个最大值即可。

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 1010;
     9 char map[maxn][maxn];
    10 int h[3][maxn], l[3][maxn], r[3][maxn];
    11 
    12 int main(void)
    13 {
    14     #ifdef LOCAL
    15         freopen("2870in.txt", "r", stdin);
    16     #endif
    17 
    18     int row, col;
    19     while(scanf("%d%d", &row, &col) == 2)
    20     {
    21         int i, j, k, t;
    22         for(i = 0; i < row; ++i)
    23             scanf("%s", map[i]);
    24         memset(h, 0, sizeof(h));
    25         int ans = 0;
    26         for(i = 0; i < row; ++i)
    27         {
    28             for(j = 0; j < col; ++j)
    29             {
    30                 switch(map[i][j])
    31                 {    //处理h数组
    32                     case 'a':
    33                         ++h[0][j], h[1][j] = h[2][j] = 0;
    34                         break;
    35                     case 'b':
    36                         ++h[1][j], h[0][j] = h[2][j] = 0;
    37                         break;
    38                     case 'c':
    39                         ++h[2][j], h[0][j] = h[1][j] = 0;
    40                         break;
    41                     case 'w':
    42                         ++h[0][j], ++h[1][j], h[2][j] = 0;
    43                         break;
    44                     case 'x':
    45                         ++h[1][j], ++h[2][j], h[0][j] = 0;
    46                         break;
    47                     case 'y':
    48                         ++h[0][j], ++h[2][j], h[1][j] = 0;
    49                         break;
    50                     case 'z':
    51                         ++h[0][j]; ++h[1][j], ++h[2][j];
    52                 }
    53             }
    54             l[0][0] = l[1][0] = l[2][0] = 0;
    55             r[0][col-1] = r[1][col-1] = r[2][col-1] = col-1;
    56             for(j = 1; j < col; ++j)
    57                 for(k = 0; k < 3; ++k)
    58                 {
    59                     t = j;
    60                     while(t > 0 && h[k][j] <= h[k][t-1])
    61                         t = l[k][t-1];
    62                     l[k][j] = t;
    63                 }
    64 
    65             for(j = col-2; j >= 0; --j)
    66                 for(k = 0; k < 3; ++k)
    67                 {
    68                     t = j;
    69                     while(t < col-1 && h[k][j] <= h[k][t+1])
    70                         t = r[k][t+1];
    71                     r[k][j] = t;
    72                 }
    73 
    74             for(j = 0; j < col; ++j)
    75                 for(k = 0; k < 3; ++k)
    76                     ans = max(ans, (r[k][j]-l[k][j]+1)*h[k][j]);
    77         }
    78         printf("%d
    ", ans);
    79     }
    80     return 0;
    81 }
    代码君
  • 相关阅读:
    JavaScript教程——JavaScript 的基本语法(标识符)
    ECMAScript 6 入门——ES6 声明变量的六种方法
    JavaScript教程——数据类型概述
    对称机密算法与非对称机密算法
    C语言提高 (2) 第二天 用指针对字符串进行操作
    C语言提高 (1) 第一天 数据类型本质与内存四区
    关于内存地址和内存空间的理解(转)
    为什么对数组处理的函数需要传递数组长度
    Unicode编码,解释UCS、UTF、BMP、BOM等名词
    上海
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3876819.html
Copyright © 2011-2022 走看看