zoukankan      html  css  js  c++  java
  • 最大子矩阵问题

      给一个棋盘,里边有许多黑白格子,要求找出一块连续的矩形,似的矩形内部的格子全部为白色,并且面积(周长)最大。

    王知昆的《浅谈用极大化思想解决最大子矩形问题》里边有讲解。这里给出模板

    void solve(int x) {    //x表示要求矩形的颜色0为黑色,1为白色
        int i, j;
        for(i = 1; i <= m; ++i) {
            H[i] = 0; L[i] = 1; R[i] = m;
        }
    
        int lm, rm;
        for(i = 1; i <= n; ++i) {
            lm = 1, rm = m;
            for(j = 1; j <= m; ++j) {
                if(mp[i][j] == x) {
                    H[j]++;
                    if(L[j] < lm)   L[j] = lm;
                } else {
                    H[j] = 0; lm = j + 1; L[j] = 1; R[j] = m;
                }
            }
            for(j = m; j >= 1; --j) {
                if(H[j]) {
                    if(R[j] > rm)   R[j] = rm;
                    ans = max(ans, (H[j] + R[j] - L[j] + 1)*2);    
    //这是求周长 ans = max(ans, H[j]*(R[j] - L[j] + 1)是求面积。
    //当然也可以是每个格子给出一个value,然后求最大value,这样就是预处理一下整个棋盘,然后找(j, L[j]), (H[j], R[j])这块区域的value总和 } else { rm = j - 1; } } } }
  • 相关阅读:
    CentOS7安装node环境
    【异常】update更新java.sql.SQLException: Duplicate entry '2019-07-30 00:00:00-110100' for key
    MySQL查询多行重复数据SQL
    Phoenix批量提交优化,官网的demo
    (转) 读懂IL
    Docker
    Docker
    Rest之路
    (转)Docker
    Docker
  • 原文地址:https://www.cnblogs.com/vongang/p/2619558.html
Copyright © 2011-2022 走看看