經典演算法題之Maximal Square

2021-08-07 18:33:42 字數 941 閱讀 1217

maximal square是道非常有意思的演算法題。它是乙個典型的動態規劃問題,同時也是2017京東面試題,2016華為機考題。

有乙個n*m大小的矩陣,其元素值為0或者1,求這個矩陣中全有1組成的最大方塊其大小。

每個輸入包含乙個測試用例。每個測試用例的第一行包含兩個整數n(2<= n <= 50),m(2<= n <= 50),分別表示矩陣matrix的行數與列數。接下來的每一行是該矩陣的每一行元素,其取值為1或者0。

輸出矩陣中全有1組成的最大方塊的大小。

4 61 1 0 1 1 1

0 1 1 1 1 1

1 1 0 1 1 1

1 1 0 0 1 1

思路分析:

本題為乙個典型的動態規劃問題,因此可以使用動態規劃的思想進行。動態規劃重要的乙個特點是要復用子問題。

假設以matrix[i][j]為右下頂點的最大方塊的大小為dp[i][j]。那麼dp[i][j]的計算否可以復用比其更小的子問題呢?不難想象,如果matrix[i][j]=0,那麼dp[i][j]=0。當matrix[i][j]=1時,此時要考察dp[i-1][j-1],dp[i-1][j]及dp[i][j-1],這是由於以matrix[i][j]的為右下頂點的最大方塊由上面三個位置決定,而且是木桶效應,由最小值所決定,即dp[i][j]=min + 1。考慮到邊界條件,可以得到最終的遞迴方程為: dp

[i][

j]=,

otherwise

只需要找到最大的dp[i][j]值即得到最大方塊的大小。整個演算法的時間複雜度與空間複雜度均為o(n*m)。

具體實現**(c++)

經典演算法題

題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21 分析 首先這個你得找規律,這個剛開始的時候不要太心急。不難看出有個很好的式子 從第三個...

PHP經典演算法題

面試題 演算法題 1 插入排序 一維陣列 基本思想 每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序 直到待排序資料元素全部插入完為止。示例 初始關鍵字 49 38 65 97 76 13 27 49 j 2 38 38 49 65 97 76 13 27 49 j...

Python 經典演算法題

概念 動態規劃過程是 每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。演算法關鍵點 1 最優化原理,也就是最有子結構性質。這指的是乙個最優化策略具有這樣的性質,無論過去狀態和決策如何,對前面的決策所形成的...