最大子矩阵问题

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

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

 

 

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; } } } }

 

 

 

posted @ 2012-08-02 10:55  AC_Von  阅读(410)  评论(0编辑  收藏  举报