Victoree's Blog

1915_가장 큰 정사각형 본문

Algorithm/2019~2020

1915_가장 큰 정사각형

victoree 2021. 4. 22. 17:46
728x90

Concept & Idea

다이나믹 프로그래밍적으로 사고하는 것은 맞았다.
내가 i,j에 위치해있을 때, [i-1][j-1], [i][j-1],[i-1][j]를 검사하는 것이 중요했다.
처음에는 max값으로 잡았는데, min값으로 잡아야 했었다.
min으로 잡고나니 또 다른 문제가 발생했었는데, dp배열을 내가 계속 갱신해주고 있었던 것이 문제였다.

dp[i][j]=t; dp[i-1][j-1]=t; dp[i][j-1]=t; dp[i-1][j]=t;

이 작업을 생략하고, 그냥 dp[i][j]=t 를 해주니 맞았다.

Code

#include <iostream>
#include <string>
using namespace std;
string map[1001];
int dp[1001][1001];
int n,m;
int res=0;
int main() {
    cin>>n>>m;
    for(int i=0; i<n; i++) {
        cin>>map[i];
    }
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            if(map[i][j]=='1') {
                if(res<1)
                    res=1;
                dp[i][j]=1;
                if(i-1>=0 && j-1>=0) {
                    if(dp[i-1][j-1]!=0 && dp[i][j-1]!=0 && dp[i-1][j]!=0) {
                        int t=0;
                        if(dp[i-1][j-1]==dp[i][j-1] && dp[i-1][j]==dp[i-1][j-1] && dp[i][j-1] == dp[i-1][j-1]) {
                            t=dp[i-1][j-1]+1;
                        } else {
                            t=min(min(dp[i-1][j-1], dp[i][j-1]), dp[i-1][j])+1;
                        }
                        dp[i][j]=t;
                        if(res<t)
                            res=t;
                    }
                }
            }
        }
    }
    cout<<res*res<<endl;
}

 

Fealing

그래도 사고하는 것은 맞아서 다행이다.
좋은 문제였던 것 같다.

728x90

'Algorithm > 2019~2020' 카테고리의 다른 글

14003_가장 긴 증가하는 부분 수열5  (0) 2021.04.22
12738_가장 긴 증가하는 부분 수열3  (0) 2021.04.22
2011_암호코드  (0) 2021.04.22
9461_파도반 수열  (0) 2021.04.22
2133_타일 채우기  (0) 2021.04.22
Comments