(洛谷P1387)最大正方形

2021-10-07 23:50:19 字數 2116 閱讀 7553

題目描述

二維動態規劃,設dp(

i,j)

\ dp\left(i,j\right)

dp(i,j

)為以(i,

j)

\ \left(i,j\right)

(i,j

)為右下頂點的正方形的最大邊長。則容易想到dp(

i,j)

\ dp\left(i,j\right)

dp(i,j

)僅與dp(

i−1,

j)

\ dp\left(i-1,j\right)

dp(i−1

,j)、dp(

i,j−

1)

\ dp\left(i,j-1\right)

dp(i,j

−1)和dp(

i−1,

j−1)

\ dp\left(i-1,j-1\right)

dp(i−1

,j−1

)有關。

而我們知道,倘若存在以(i,

j)

\ \left(i,j\right)

(i,j

)為右下頂點的正方形,則其邊長必在[1,

min(

dp(i

−1,j

),dp

(i,j

−1))

]\ \left[1,min\left(dp\left(i-1,j\right),dp\left(i,j-1\right)\right)\right]

[1,min

(dp(

i−1,

j),d

p(i,

j−1)

)]。確定了邊長範圍以後,自然可以就通過遍歷dp(

i−m,

j−m)

\ dp\left(i-m,j-m\right)

dp(i−m

,j−m

)得到最優解了。

狀態轉移方程如下:

d p(

i,j)

=0 &\text p[i][j]==0\\1 &\text i==0 \ or\ j==0\ and\ p[i][j]==1 \\ max(m) &\text\ for\ m \ in \left[1,min\left(dp\left(i-1,j\right),dp\left(i,j-1\right)\right)\right] and\ p\left(i-m,j-m\right)==1\end

dp(i,j

)=⎩⎪

⎨⎪⎧​

01ma

x(m)

​if p[

i][j

]==0

if i==

0orj

==0a

ndp[

i][j

]==1

elsefo

rmin

[1,m

in(d

p(i−

1,j)

,dp(

i,j−

1))]

andp

(i−m

,j−m

)==1

潛在優化:

占個坑先。。。

**如下:

#include

#include

using

namespace std;

int r, c;

int p[

100]

[100]=

;int dp[

100]

[100]=

;int

findans()

} dp[i]

[j]= subl +1;

result =

max(result, dp[i]

[j]);}

}}//return (result - 1) * 4; //求周長

return result;

//求邊長

}int

main()

} cout <<

findans()

<< endl;

return0;

}

洛谷 P1387 最大正方形

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

洛谷P1387 最大正方形

在乙個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...

洛谷 P1387 最大正方形

題目大意 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。思路 先是我個人的奇怪dp,我是覺得這個換成1維的話很像最長遞增子串行。dp i j 2 表示以該點為右下角的最大由1組的的矩形的邊長 dp i j 2 dp i 1 j 1 2 1 當dp i 1 j 1 t 1 ...