luogu p1387 最大正方形

2022-08-17 12:06:09 字數 1035 閱讀 3521

理論上來說可以暴力列舉邊長和右下角座標,而且似乎有人能用這方法過這道題。。。

不過列舉太不現實,而且資料強一點的話就徹底沒辦法了,還是要dp。

用兩個陣列l,w分別儲存每個位置(包括本身)向左和向上各有幾個連續的1,如果乙個位置是1,這個位置的w和l就能從別的位置轉移過來。(似乎預處理能與輸入一起完成?不過我沒這麼做。)

然後對f陣列進行處理,對於每乙個正方形,我們都可以把它看作是一層一層的,像這樣:

第一層:

1

第二層:

0 1

1 1

第三層:

0 0 1

0 0 1

1 1 1

如果能構成正方形,那麼前面的幾層都必須是完整的。對於每乙個a[i][j]==1的位置,f[i][j]的取值為f[i-1][j-1]+1,l[i][j]與w[i][j]的最小值

插一句,luogu上資料略水,處理f的時候把m寫成n居然都有90分。。。

#includevoid read(int &y)

}int n,m,a[105][105

],ans;

int f[105][105],l[105][105],w[105][105

];int min(int x,int

y)int

main()

for(int i=1;i<=n;i++)}}

for(int i=1;i<=n;i++)}}

printf("%d

",ans);

return0;

}

洛谷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 輸出...

P1387 最大正方形

法1 矩陣字首和 n 3 列舉點i,j 和邊長o,如果右下角與左下角之間的數是完全平方數,既是正方形。include include include include include include include include define ll long long using namespace...

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...