Maximal Rectangle

題目
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

答案
類似Maximal Square,但是是錯(cuò)誤的dp解法
因?yàn)槟銢]法完全根據(jù)左邊,上邊,和左上角的三個(gè)cell的dp值來決定當(dāng)前cell的dp值

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix.length == 0) return 0;
        int rows = matrix.length, cols = matrix[0].length;
        int[][][][] dp = new int[rows][cols][3][2];
        int max_area = 0;
        // base case dp[0][0]
        if(matrix[0][0] == '1') {
            for(int i = 0; i < 3; i++) {
                int w = 1, h = 1;
                dp[0][0][i][0] = w;
                dp[0][0][i][1] = h;
                max_area = Math.max(max_area, w * h);
            }
        }

        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < cols; j++) {
                // Skip base case
                if(i == 0 && j == 0) continue;
                // Skip '0' case
                if(matrix[i][j] == '0') continue;

                // Choice 0
                int w = 1;
                int h = 1 + ((i > 0) ? dp[i - 1][j][0][0] : 0);
                dp[i][j][0][1] = w;
                dp[i][j][0][0] = h;
                max_area = Math.max(max_area, w * h);

                // Choice 1
                w = 1 + ((j > 0) ? dp[i][j - 1][1][1] : 0);
                h = 1;
                dp[i][j][1][1] = w;
                dp[i][j][1][0] = h;
                max_area = Math.max(max_area, w * h);

                // Choice 2
                w = 1 + ((i > 0 && j > 0) ? Math.min(dp[i - 1][j - 1][2][1], dp[i][j - 1][1][1]) : 0);
                h = 1 + ((i > 0 && j > 0) ? Math.min(dp[i - 1][j - 1][2][0], dp[i - 1][j][0][0]) : 0);
                dp[i][j][2][1] = w;
                dp[i][j][2][0] = h;
                max_area = Math.max(max_area, w * h);
            }
        }

        return max_area;
    }
}

正確答案
從這個(gè)題學(xué)會(huì)了:
有時(shí)候dp題,你并不能直接找到recurrence用以直接計(jì)算答案
但是你可以找到相關(guān)的其他變量x來計(jì)算recurrence,然后再用x來計(jì)算你所需的答案

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix.length == 0) return 0;
        int rows = matrix.length, cols = matrix[0].length, max_area = 0;

        // dp[i][j] records how many consecutive 1's from left to grid[i][j]
        int[][] dp_horz = new int[rows][cols];
        for(int i = 0; i < rows; i++)
            if(matrix[i][0] == '1') dp_horz[i][0] = 1;

        for(int i = 0; i < rows; i++) {
            for(int j = 1; j < cols; j++) {
                if(matrix[i][j] == '0') continue;
                dp_horz[i][j] = dp_horz[i][j - 1] + 1;
            }
        }

        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < cols; j++) {
                if(matrix[i][j] == '0') continue;

                // How many consecutive 1's to the left of matrix[i][j]
                int left1s = dp_horz[i][j];

                // Iterate up
                int min_w = left1s;
                for(int k = i; k >= 0; k--) {
                    int h = i - k + 1;
                    int w = dp_horz[k][j];
                    if(w < min_w) min_w = w;
                    int area = h * min_w;
                    max_area = Math.max(max_area, area);
                }
            }
        }
        return max_area;
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Problem Given a 2D binary matrix filled with 0's and 1's,...
    AlexSun1995閱讀 588評(píng)論 0 0
  • Given a 2D binary matrix filled with 0's and 1's, find th...
    Jeanz閱讀 360評(píng)論 0 0
  • 大家好,我今天最想分享的是,我的晚會(huì)感悟:我們經(jīng)理今晚讓我負(fù)責(zé)安排所有的會(huì)議內(nèi)容,說我有責(zé)任心,這個(gè)詞是他第一次評(píng)...
    童瞳看世界閱讀 185評(píng)論 0 0
  • 大號(hào) 3號(hào)字體 小號(hào) 簡(jiǎn)書 一盞燈, 一片昏黃;一簡(jiǎn)書, 一杯淡茶。 守著那一份淡定, 品讀屬于自己的寂寞。 保持...
    70歲了還要浪閱讀 131評(píng)論 0 0
  • 不知道過了多久啊,耳邊依然是火車的轟鳴聲,一聲一聲碾在鐵軌上,也碾在我的心上。 好像已經(jīng)不記得最早最早坐...
    喵喵醬97閱讀 251評(píng)論 2 2

友情鏈接更多精彩內(nèi)容