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 最優化原理,也就是最有子結構性質。這指的是乙個最優化策略具有這樣的性質,無論過去狀態和決策如何,對前面的決策所形成的...