洛谷習題 最大正方形

2022-07-16 20:03:18 字數 1134 閱讀 2230

最近學oi有點過火,今早上愣是沒睡醒,上午的自習就沒有了!不過還是很開心,連a三道dp水題。

這個題的話,思路比較清晰。我們想知道有沒有邊長為l的正方形,肯定要先知道有沒有邊長為l-1的正方形。我們列舉乙個正方形的左上角,然後搬著乙個邊長為l-1的正方形在四個角上跑,如果這四個角上的小正方形全是1,那麼這個邊長為l的正方形肯定也全是1,否則取其中最大的。描述的有點凌亂,看**就好了。一開始傻了一般開了乙個四維陣列儲存正方形的四個頂點,這樣是沒有必要的,因為乙個左上角的頂點和邊長就能確定乙個正方形。

1 #include 2 #include 3

4using

namespace

std;56

const

int mmax = 105;7

8int

map[mmax][mmax], dp[mmax][mmax][mmax];

9int

main()

17for (int l = 2; l <= min(n,m); ++l)

25if (ans < l) break;26

}27 printf("%d"

, ans);

28return0;

29 }

ac**

實際上,這樣做也不算太優秀。我們可以定義dp[i][j]表示以(i,j)為右下角的最大正方形的邊長。那麼對於map[i][j]==1,則有dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1。顯然是對的,每次考慮能否將(i,j)加入到已有的正方形中,那他一定可以加入以(i-1,j-1)、(i-1,j)、(i,j-1)為右下角的最大正方形中最小的那個,因為最大正方形要求裡面全是1。

1 #include 2 #include 3

4using

namespace

std;56

const

int mmax = 105;7

8int

dp[mmax][mmax];910

intmain() 20}

21 printf("%d"

, ans);

22return0;

23 }

ac**(更優秀)

洛谷1387 最大正方形

在乙個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 0 1 1 0 1 輸出...

洛谷 1761 正方形

有n個大小不一的正方形,現將它們依次以45度斜放入第一象限,每個正方形都要與x軸有乙個交點,且不能與之前放入的正方形重疊。在此前提下,正方形與x軸交點的座標應盡可能小。問這樣放置後,從上往下看,至少能部分被看見的正方形有哪些?每個測試點包含多組測試資料。每個測試資料的第一行是乙個整數n,第二行是n個...

洛谷 P1387 最大正方形

題目描述 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入輸出格式 輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入輸出樣例 輸入樣例 1 4 4 0 1 1 1 1 ...