雖然棋棋寫的都是淺顯的東西,不能同那些大佬相提並論,但始終要加油,加油,加加油,畢竟最初的目的是為了自己而記錄的。記一次動態規劃演算法——最大正方形問題。
給定乙個由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)次)。
最後貼上我的**:
1private
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...