๋์ด๋ : ๊ณจ๋ 3
๊ฑธ๋ฆฐ ์๊ฐ : 20๋ถ
๋ฌธ์
์์ฌ์์ด ํ๋ค ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
๋ฌธ์
n*n์ ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค. ์์ฌ์์ด ํ๋ค๋ ์ด๋ค ์ง์ญ์์ ๋๋๋ฌด๋ฅผ ๋จน๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณณ์ ๋๋๋ฌด๋ฅผ ๋ค ๋จน์ด ์น์ฐ๋ฉด ์, ํ, ์ข, ์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ๊ณณ์์ ๋๋๋ฌด๋ฅผ ๋จน๋๋ค. ๊ทธ๋ฐ๋ฐ ๋จ ์กฐ๊ฑด์ด ์๋ค. ์ด ํ๋ค๋ ๋งค์ฐ ์์ฌ์ด ๋ง์์ ๋๋๋ฌด๋ฅผ ๋จน๊ณ ์๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ฉด ๊ทธ ์ฎ๊ธด ์ง์ญ์ ๊ทธ ์ ์ง์ญ๋ณด๋ค ๋๋๋ฌด๊ฐ ๋ง์ด ์์ด์ผ ํ๋ค. ๋ง์ฝ์ ๊ทธ๋ฐ ์ง์ ์ด ์์ผ๋ฉด ์ด ํ๋ค๋ ๋ถ๋ง์ ๊ฐ์ง๊ณ ๋จ์ ํฌ์์ ํ๋ค๊ฐ ์ฃฝ๊ฒ ๋๋ค(-_-)
์ด ํ๋ค์ ์ฌ์ก์ฌ๋ ์ด๋ฐ ํ๋ค๋ฅผ ๋๋๋ฌด ์ฒ์ ํ์ด ๋์์ผ ํ๋๋ฐ, ์ด๋ค ์ง์ ์ ์ฒ์์ ํ์ด ๋์์ผ ํ๊ณ , ์ด๋ค ๊ณณ์ผ๋ก ์ด๋์ ์์ผ์ผ ๋ ๋ค ์์คํ ์๋ช ์ด์ง๋ง ํ๋ค๊ฐ ์ต๋ํ ์ค๋ ์ด ์ ์๋์ง ๊ณ ๋ฏผ์ ๋น ์ ธ ์๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ์ด ์ฌ์ก์ฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ์ด๋ค. n*n ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์ฃผ์ด์ ธ ์์ ๋, ์ด ํ๋ค๊ฐ ์ต๋ํ ์ค๋ ์ด๋ ค๋ฉด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํตํ์ฌ ์์ง์ฌ์ผ ํ๋์ง ๊ตฌํ์ฌ๋ผ.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋๋๋ฌด ์ฒ์ ํฌ๊ธฐ n(1 ≤ n ≤ 500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋์งธ ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ๋๋๋ฌด ์ฒ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋๋ฌด ์ฒ์ ์ ๋ณด๋ ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ๋๊ณ ๊ฐ ์ง์ญ์ ๋๋๋ฌด์ ์์ด ์ ์ ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ค. ๋๋๋ฌด์ ์์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
ํ์ด
- ์์ ํ์ : ๋ชจ๋ ๋ฐฐ์ด ์์์์ ์์ํด์ ๊ฒฝ๋ก๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด์ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก ์ฐพ๊ธฐ
- ์์ ๋ฌธ์ : ํด๋น ์๋ฆฌ์์ ๊ฐ์ฅ ํ๊ณ ๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ๊ธธ์ด
- ์ฌ๊ท ํจ์ : (ํ์ฌ ์๋ฆฌ) => ๊ฒฝ๋ก ๊ธธ์ด
- ์ข ๋ฃ ์กฐ๊ฑด : ์ํ์ข์ฐ์ ๊ฐ ์ ์๋ ๊ณณ์ด ์์ ๋
- DP : ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ์ ์ฅํด์ ์ฌ์ฉ
- ์์ผ๋ก ํํ :
arr[i][j] = (์์ ๋ณด๋ค ๋์ ๋ค ๋ฐฉํฅ์ arr[k][l] ์ค max) + 1
(top down ๋ฐฉ์)- ๋ค ๋ฐฉํฅ์ arr ๊ฐ์ด ๊ฒฐ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ํ ์ ์์ => ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ์ง ์์
- ์ฌ๊ทํจ์๋ก ํ์!
์ฝ๋
#include <iostream>
#include <cstring>
using namespace std;
int n;
int direction[4][2] = { {-1,0}, {0, 1}, {1, 0}, {0, -1} };
int tree[501][501];
int memo[501][501];
int maxLivingDay(int r, int c) {
if (memo[r][c] != -1)
return memo[r][c];
memo[r][c] = 1;
for (int k = 0; k < 4; k++) {
// ์ํ์ข์ฐ
int row = r + direction[k][0];
int col = c + direction[k][1];
if (row < 0 || row >= n || col < 0 || col >= n) continue; // ๋งต์ ๋ฒ์ด๋๋ฉด
if (tree[r][c] >= tree[row][col]) continue; // ๋ ์ ์ ๊ณณ์ผ๋ก๋ x
if (memo[row][col] != -1) {
memo[r][c] = max(memo[r][c], memo[row][col]+1);
continue;
}
memo[r][c] = max(memo[r][c], maxLivingDay(row, col)+1);
}
return memo[r][c];
}
int main() {
// 09: 53 ์์ => 10:15 ๋ (20๋ถ!)
// ์
๋ ฅ ๋ฐ๊ธฐ
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> tree[i][j];
}
}
// ์ด๊ธฐํ
memset(memo, -1, sizeof(memo));
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// ๊ฐ ์๋ฆฌ์์ ์์ํด์
res = max(res, maxLivingDay(i, j));
}
}
cout << res << endl;
}
์ฃผ์ํ ์
- ํ ๋ฐฉํฅ์ด ์๋ ์ฌ๋ฐฉ์ผ๋ก ๊ฐ ์ ์๋ ์์ ํ์์์๋ ํจ์์์ ์ด์ฉํ๊ธฐ ์ด๋ ค์
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1916 :: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (0) | 2021.04.12 |
---|---|
[c++] BOJ 1915 :: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2021.04.12 |
[c++] BOJ 1753 :: ์ต๋จ๊ฒฝ๋ก (0) | 2021.04.06 |
[c++] BOJ 1005 :: ACM Craft (0) | 2021.03.21 |
[c++] BOJ 2225 :: ํฉ๋ถํด (0) | 2021.03.21 |
Comment