๋ฌธ์ ๋งํฌ
1915๋ฒ: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (acmicpc.net)
1915๋ฒ: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
์ฒซ์งธ ์ค์ n, m(1 ≤ n, m ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ m๊ฐ์ ์ซ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
0,1๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์์ 1๋ก๋ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
[BOJ] 1028 : ๋ค์ด์๋ชฌ๋ ๊ด์ฐ
๋ฌธ์ ๋งํฌ 1028๋ฒ: ๋ค์ด์๋ชฌ๋ ๊ด์ฐ (acmicpc.net) 1028๋ฒ: ๋ค์ด์๋ชฌ๋ ๊ด์ฐ ์ฒซ์งธ ์ค์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. R๊ณผ C๋ 750๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ R๊ฐ์ ์ค์๋ ๋ค์ด์๋ชฌ๋ ๊ด์ฐ์ ๋ชจ์์ด
jk6722.tistory.com
์ ๋ฒ์ ํ์ด๋ดค๋ ๋ค์ด์๋ชฌ๋ ๊ด์ฐ์ ํ์๋ฒ์ ์ธ ๊ฒ ๊ฐ๋ค.
ํ์ด
๋จผ์ ๊ฐ ์ง์ ๋ง๋ค ๊ทธ ์ง์ ๋ถํฐ ๊ฐ๋ก๋ก ์ต๋๊ธธ์ด๋ฅผ Right ๋ผ๋ ๋ฐฐ์ด์ ์ ์ฅํด๋์๋ค.
๋ง์ฝ ๊ทธ๋ฆผ์ฒ๋ผ ๋งจ ์์ชฝ, ๋งจ ์ผ์ชฝ ์ง์ ์ธ (1,1)์ ๊ธฐ์ค์ผ๋ก ์ต๋๊ธธ์ด๊ฐ ์๋๋ก ๊ฐ๋ฉด์ ๊ฐ๊ฐ 3, 2, 2 ์ด๋ค. ์ด๋ ์ต๋ ์ฌ๊ฐํ์ผ ํฌ๊ธฐ๋ 4์ธ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ด์ 3, 2, 2์ผ ๋ ์ต๋ํฌ๊ธฐ๊ฐ 4์ธ ๊ฒ์ ๋ฐ๋ก ์ ์ ์์ง๋ง ์ฝ๋๋ก๋ ์ด๋ป๊ฒ ์์ํ ๊น?
(1,1) ์ง์ ์ ์์์ผ๋ก x์ถ์ ๊ณ ์ ํด๋์ฑ y๋ง ํ๋์ฉ ๋๋ ค๊ฐ๋ฉด์ ํ์ํ๋ค. ์ฌ๊ธฐ์ ํ์ ๋ฒ์๋ ์ ๋์ ์ผ๋ก ๋ฐ๊ฟ์ค์ผํ๋ค. ์ ๊ทธ๋ฆผ์ ์์๋ก ์ฒ์์ (1,1) ์ง์ ์์ ๊ฐ๋ก ์ต๋๊ธธ์ด๋ 3์ด๋ฏ๋ก 3X3 ์ง๋ฆฌ ์ ์ฌ๊ฐํ์ ๋ง๋ค ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋๋ค. ํ์ง๋ง (2,1)๋ก ๋ด๋ ค์์ ๋ ๊ฐ๋ก ์ต๋๊ธธ์ด๊ฐ 2์ด๋ฏ๋ก 3X3 ์ง๋ฆฌ ์ ์ฌ๊ฐํ์ ์ด๋ฏธ ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ๊น์ง ์ต๋ ํฌ๊ธฐ๋ 4์ด๊ณ ๋ ์ด์ ํ์์ ์๋ฏธ๊ฐ ์๋ค. ํ์๋ฒ์๋ฅผ ์ค์ฌ์ ํ์์ ์ข ๋ฃ์ํจ๋ค.
(i, j) ์ง์ ์์ ์ต๋ ์ ์ฌ๊ฐํ ํฌ๊ธฐ๋ฅผ ํ์ํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ํ์ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
int boundary = Right[i][j];
int Max = 1;
for (int k = 0; k < boundary; k++) {
if(Right[i+k][j] >= k + 1)
Max = max(Max, k + 1);
boundary = min(boundary, Right[i + k][j]);
}
ans = max(Max, ans);
boundary๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋ ์ ์๋ ์ ์ฌ๊ฐํ ํ ๋ณ์ ๊ธธ์ด์ ์ต๋์ด๋ค. ์ด๊ธฐ๊ฐ์ ์์ ์ง์ ์ ์ต๋ ๊ฐ๋ก ๊ธธ์ด์ด๋ค.
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<ll, int>, pair<int, int>>, vector<pair<pair<ll, int>, pair<int, int>>>, greater<pair<pair<ll, int>, pair<int, int>>>> Priority_queue;
const long long INF = LLONG_MAX;
const int MAX_N = 1000 + 5;
int Map[MAX_N][MAX_N];
int N, M;
int Right[MAX_N][MAX_N];
int main(void) {
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%1d", &Map[i][j]);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (Map[i][j] != 1)
continue;
if (j > 0 && Right[i][j - 1] != 0) {
Right[i][j] = Right[i][j - 1] - 1;
continue;
}
int cnt = 0;
for (int k = j; k < M; k++) {
if (!Map[i][k])
break;
cnt++;
}
Right[i][j] = cnt;
}
}
int ans = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (!Map[i][j])
continue;
int boundary = Right[i][j];
int Max = 1;
for (int k = 0; k < boundary; k++) {
if(Right[i+k][j] >= k + 1)
Max = max(Max, k + 1);
boundary = min(boundary, Right[i + k][j]);
}
ans = max(Max, ans);
}
}
cout << ans * ans << "\n";
return 0;
}
|
cs |
ans์ ์ ์ฅ๋ ๊ฐ์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด ์ด๋ฏ๋ก ํฌ๊ธฐ๋ ans * ans ๋ฅผ ์ถ๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
2๋ ์ ์ ๋ชปํ์๋ ๋ฌธ์ ๋ฅผ ํ์๋ค.
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 5582 : ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด (0) | 2022.04.05 |
---|---|
[BOJ] 2533 : ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2022.04.05 |
[BOJ] 24888 : ๋ ธํธ ์กฐ๊ฐ (0) | 2022.03.31 |
[BOJ] 24887 : ์ต๋ํ์ ํด์ (0) | 2022.03.30 |
[BOJ] 24885 : ์ฃผ์ (0) | 2022.03.29 |