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 |