演算法 最大正方形問題

2022-08-19 13:15:14 字數 2054 閱讀 7590

雖然棋棋寫的都是淺顯的東西,不能同那些大佬相提並論,但始終要加油,加油,加加油,畢竟最初的目的是為了自己而記錄的。

記一次動態規劃演算法——最大正方形問題。

給定乙個由0和1組成的2維矩陣,返回該矩陣中最大的由1組成的正方形的面積

測試案例1:

輸入:,,,

}輸出:

4測試案例2:

輸入:,,,

,}測試案例3:

輸入:,

}輸出:

1測試案例4:

輸入:,,,

,,,,

,,,,

,,,}

輸出:49

解題思路:

說明:黑色:上輪查詢後滿足條件的點。

黃色:本次查詢過程中,滿足條件的點。

紅色:本次查詢過程中,不滿足條件的點。

思路1:

第1次查詢,發現目標點滿足要求,繼續下一次查詢。

第2次查詢,邊長擴大1,本次需要檢驗的範圍是2×2。發現也全部滿足,繼續下一次查詢。

第3次查詢,邊長繼續擴大1,所以本次的正方形為3×3,咦,有乙個不滿足條件,那麼基於這個點為右下角的最大邊長就是2。

思路2:暴力破解著實顯得有點浪費資源啊,明明第一次已經校驗通過的,為什麼擴大後又要再校驗一次。所以思路2就是在思路1的基礎上,站在前人的經驗結論繼續深造(即前一次確認有效的就不用再校驗了,可以直接拿過來使用)。

設dxy為以(x,y)的右下角的最長正方形邊長。

假設目標點dxy的左上角d(x-1)(y-1)的結果為2(當然也可以是其他的值),可以得出dxy的最大值就是d(x-1)(y-1)+1。

第1次查詢,目標大小1×1,目標滿足。

第2次查詢,目標大小2×2,看圖中可以很明白可以看出來,此次只要檢驗平行於x軸的乙個點,以及平行於y軸的乙個點即可,相較於「暴力破解」減少了2次校驗。

第3次查詢,目標大小3×3,這次繼續校驗2個點即可,如果滿足,那麼dxy=3,如果不滿足dxy=2。

總結:思路2與思路1相比,思路2每次查詢只要校驗2個單元格,但是思路1每次都要找n*n個單元格(可能有人會說,也利用上次,那也要校驗n*n-(n-1)*(n-1)次)。

最後貼上我的**:

1

private

final

char zero='0';

2public

int getmaxsquare(char matrix, int x, int y, int

targetlenth)

6int maxsquaresidex = 1, maxsquaresidey=1;

7for (int i=x-targetlenth; i)11}

12for (int j=y-targetlenth; j)16}

17return

math.min(maxsquaresidex,maxsquaresidey);18}

19/**

20* 最大正方形

21*

@param

matrix char字元型二維陣列

22*

@return

int整型

23*/

24public

int solve (char

matrix)

34//

初始化y軸

35for (int i=0; i)

39//

以dp[i][j]作為右下角,值為邊長

40int

side;

41for (int i=1;i)else52}

53}54return (maxside-zero)*(maxside-zero);

55 }

最大正方形

題目鏈結 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製 4 4 0 1 1 1 1 1 1 0 0 1 1...

最大正方形

題解 if a i j 1 f i j min min f i j 1 f i 1 j f i 1 j 1 1 f i j 表示以節點i,j為右下角,可構成的最大正方形的邊長。只有a i j 1時,節點i,j才能作為正方形的右下角 對於乙個已經確定的f i j x,它表明包括節點i,j在內向上x個節...

最大正方形

一.題目描述 在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 二.思路 動態規劃 當前元素matrix i j 對應的最大正方形邊長跟matrix i 1 j m...