https://www.acmicpc.net/problem/1915


0과 1로 된 배열에서 가장 큰 정사각형의 크기를 묻는 문제다.

즉, 1로만 이루어진 정사각형을 알아내야 한다.


문제에 접근할 때 (i,j)를 기준으로

(i-1,j) / (i,j-1) / (i-1,j-1) 각각 정사각형의 길이를 알면

(i,j)에서 위의 3가지 경우 중에서 가장 작은 정사각형 길이를 가진 것보다 1만 큼 더 긴 정사각형을 가질 수 있다.

왜냐하면 (i,j)에서 다시 1만큼 추가되기 때문이다.


1부터 n, m까지 (i,j)의 값이 1이라면

3가지 경우 중에 가장 작은 길이보다 1을 더 추가한 길이가 (i,j)의 정사각형 길이가 될 것이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(){
    
    int n,m;
    cin>>n>>m;
    
    vector<vector<int>> dp(n+1,vector<int>(m+1,0));
    
    char c;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>c;
            dp[i][j]=c-48;
        }
    }
    
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(dp[i][j]){
                dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
                ans=max(ans,dp[i][j]);
            }
        }
    }
    
    cout<<ans*ans<<endl;
    return 0;
}
 
cs


'알고리즘(BOJ) > DP' 카테고리의 다른 글

백준 2668번 - 줄어들지 않아  (0) 2019.04.09
백준 5582번 - 공통 부분 문자열  (1) 2019.03.25
백준 2225번 - 합분해  (0) 2018.04.01
백준 1890번 - 점프  (0) 2018.03.27
백준 1003번 - 피보나치 함수  (0) 2018.03.27

+ Recent posts