題目描述
二維動態規劃,設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 ...