P1387 最大正方形

2022-05-14 01:18:53 字數 1685 閱讀 8694

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

輸出樣例#1:

2

分析;我們用f[i][j]表示以該點為右下角的,滿足條件的,最大的正方形的邊長。

先象一下這兩種情況;

(一)如果該點的a為0,f[i][j]=0;

(二)如果它周圍的三個點中有乙個是』0』,那麼那個點的f[i][j]是1(構不成正方

形)

如果它周圍的三個點都能構成正方形,那就要想想。。。

我們從a陣列上分析

那麼

f[i][j]應該是2;

那麼,可以看出是f最小的那個點(或者說是它周圍的那些點)阻礙了f[i][j]的增大。

狀態轉移方程為f[i][j]=minn(f[i-1][j-1],f[i-1][j],f[i][j-1])+1;

#include#include

#include

#include

#include

#include

using

namespace

std;

intn,m;

int a[110][110],f[110][110

],ans;

intmain()

cout

<

return0;

}

此外還有一種做法(一位同行教的),

主體是:列舉正方形左上角的座標,以及正方形邊長。

方法是:利用 區間和 判斷是否符合。

根據注釋3,複雜度大約是n*m*log ( min(n,m) );還是比較理想的

#include#include

#include

#include

#include

#include

using

namespace

std;

int n,m,maxn=1

;int a[110][110],f[110][110

];int

main()

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

for(int j=1;j<=m;j++)

for(int k=maxn;i+k)//(如果在k*k的正方形區間中,區間和是邊長的平方,這個區間一定是飽和的)

printf("%d

",maxn);

return0;

}

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

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