藍橋杯 邊界為1的最大子方陣(預處理)

2021-10-02 20:00:19 字數 1178 閱讀 2271

,,,

, 其中,邊框全是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。...