일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- AWS
- 이더리움
- function
- BlockChain
- Thread
- 동시성
- docker
- Container
- BAEKJOON
- Algorithm
- dockerfile
- 파이썬
- IMAGE
- Ethereum
- fluent python
- Python
- 러스트
- 코어 이더리움 프로그래밍
- Refactoring
- 백준
- Network
- 플랫폼
- rust
- 블록체인
- 전문가를 위한 파이썬
- RabbitMQ
- Kubernetes
- Fast API
- guru
Archives
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
1915_가장 큰 정사각형 본문
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