,,,
, 其中,邊框全是1的最大正方形的大小是4*4,故返回4。
這道題我之前還寫過一篇採用暴力搜尋法來解決的,但是時間複雜度比較大o(n^4)可能會超時,沒看過的小夥伴可以看下:暴力搜尋版
此處我們先對這個矩陣進行預處理,有點類似於動態規劃,思路就是新建乙個n✖n✖2的三維陣列,其中規定,每乙個元素如果是1,那麼就看這個元素的右側和下側分別有多少個連續的1,然後利用三維陣列的最後一維的0號位置來存右側的(包括本身)1的個數,最後一維的1號位置來存下側的(包括本身)的1的個數。這裡有個小技巧就是應當從最後一行的最後乙個元素(即[n-1][n-1])來向前進行初始化。然後我們再檢查這個輔助三維陣列是否滿足某乙個特定的階數(例如n階)即可——檢查的方法也很簡單,只需要看當前元素(以此為邊框的左上頂點)的右側和下側是否至少有n個1,右頂點的下側是否至少有n個1,以及左下頂點的右側是否至少有n個1。看下**吧:
#include
#define n 5
using
namespace std;
intsolve
(int matrix[
][n]);
//申請乙個輔助陣列空間
int r = n-
1,c = n-1;
//r,c為要預處理的當前位置,從最後乙個元素開始
//先對最後一行初始化
for(
;c>=
0;c--
)else}}
//再對前面的預處理
//防止越界
if(n-
2>=0)
else}}
}}int n = n;
//初始階數為n
while
(n>=0)
}} n--;}
return n;
//全為0的情況
}int
main()
,,,,
};int res =
solve
(matrix)
; cout<<
"result: "
<}
時間複雜度分析:初始化輔助陣列的時候是n²(n+n²),而在檢查的時候是n³(while:n,for✖2:n²),所以只需要o(n³)的複雜度。 邊界為1的最大子方陣
思路如下,先建立乙個三維輔助陣列,第一第二位存放矩陣的行和列的下標,第三位0時,存放 當前位置向右連續共有幾個1,第三位為1時,存放當前位置向下連續共有幾個1。由於矩陣的最後一列的元素,它的底下為空,所以要先單獨提取出來,為最後一行三維陣列第三個元素向右向左單獨賦值。此後的元素賦值類似最後一列,還是...
最大子矩陣 藍橋杯
問題描述 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。接下來n行,每行m個整數,表示矩陣a。輸出格式 輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素...
藍橋杯 最大子陣
2.類似的題 zoj problem set 1074 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。樣例說明 取最後一列,和為10。資料規模和約定 對於100 的資料,1 n,m 500,a中每個元素的絕對值不超過5000。...