โถ ์ ํ
- ๊ทธ๋ฅ DFS๋ฅผ ๋๋ ธ์ ๋ ์์ฒญ๋ ์ฐ์ฐ๋(์ฌ๊ทํธ์ถ)๋ก ์ธํด ์๊ฐ์ด๊ณผ, ์คํ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ ๋ฑ์ ์ผ๊ธฐํ ์ ์๋ ๋ฌธ์ .
- ์ด์ ๊ฒฝ์ฐ์ ์๊ฐ ํ์ฌ ๊ฒฝ์ฐ์ ๋ฐ์๋๋ DP๋ฅผ ํ์ฉํด์ผ ํ๋ ์ ํ์ด๋ค.
DFS๋ ๊น์ด ์ฐ์ ํ์์ผ๋ก ํ์ฌ ์๊ธฐ ์์ ์์ ๋ค์ ์ง์ ์ผ๋ก ์ ๊ทผํ๋ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ, ์ฌ๊ทํธ์ถ ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ๋ ํด๋น ์ฌ๊ท ๋ถ๊ธฐ์์๋ ๋ฐฉ๋ฌธํ์ง ์์ ์ํ๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ map์ด ํฌ๊ฑฐ๋, ๊ทธ๋ํ์ depth๊ฐ ๊น์ผ๋ฉด ์๊ตฌํ๋ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ ์ ์๋ค.
ํผ๋ณด๋์น๊ฐ ์ ์ผ ๋ํ์ ์ธ ์์์ธ๋ฐ, ์๋ ๊ทธ๋ฆผ์ ๋ณด์
graph TD;
A(fib5) --> B(fib4)
A --> C(fib3)
B --> D(fib3)
B --> E(fib2)
C --> F(fib2)
C --> G(fib1)
D --> H(fib1)
E --> I(fib1)
F --> J(fib2)
F --> K(fib1)
G --> L(fib1)
H --> M(fib4)
H --> N(fib3)
M --> O(fib2)
M --> P(fib1)
N --> Q(fib2)
N --> R(fib1)
O --> S(fib1)
Q --> T(fib1)
leaf๋ ธ๋๋ก ๊ฐ ์๋ก ์ค๋ณต๋ ํจ์๋ค์ ๊ณ์ ํธ์ถํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ์ค๋ณตํธ์ถ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ฌ๊ทํธ์ถ ์ ์ด์ ์ ์ฐ์ฐ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์ฐธ์กฐํด์ ํธ์ถ ํ์๋ฅผ ์ค์ด๋ ๊ฒ์ธ๋ฐ ์ด๊ฑธ ๋ฉ๋ชจ์ด์ ์ด์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
DP์ ๊ฐ์ฅ ๋ฌด๋ํ ์ ๊ทผ๋ฐฉ๋ฒ์ด ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ํ์ฉํด์ ๋ค์ ๊ฐ์ ๋์ถํ๋ ๊ฒ์ด๋ฏ๋ก ์ง๊ธ ์ํฉ์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
๋์ ๋ฌธ์ ๋ก ๋ฐฑ์ค 1520๋ฒ์ ๋ด๋ฆฌ๋ง๊ธธ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
https://www.acmicpc.net/problem/1520
1520๋ฒ: ๋ด๋ฆฌ๋ง ๊ธธ
์ฒซ์งธ ์ค์๋ ์ง๋์ ์ธ๋ก์ ํฌ๊ธฐ M๊ณผ ๊ฐ๋ก์ ํฌ๊ธฐ N์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด์ด ๋ค์ M๊ฐ ์ค์ ๊ฑธ์ณ ํ ์ค์ N๊ฐ์ฉ ์์์๋ถํฐ ์ฐจ๋ก๋ก ๊ฐ ์ง์ ์ ๋์ด๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
www.acmicpc.net
โถ ์ ๋ต
๋จผ์ DP๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋์ ์ฝ๋๋ค.
import java.io.*;
import java.util.*;
class Main {
static int[] di = { -1, 0, 1, 0 };
static int[] dj = { 0, 1, 0, -1 };
static int n, m;
static int cnt = 0;
static int[][] map;
static boolean[][] v;
public static void dfs(int ci, int cj) {
if (ci == n - 1 && cj == m - 1) {
cnt++;
return;
}
boolean fail = true;
for (int i = 0; i < 4; i++) {
int ni = di[i] + ci;
int nj = dj[i] + cj;
if (isValid(ci, cj, ni, nj)) {
fail = false;
v[ni][nj] = true;
dfs(ni, nj);
v[ni][nj] = false;
}
}
if (fail)
return;
}
public static boolean isValid(int ci, int cj, int ni, int nj) {
return ni < n && nj < m && ni >= 0 && nj >= 0 && !v[ni][nj] && map[ci][cj] > map[ni][nj];
}
public static void main(String args[]) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
v = new boolean[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
v[0][0] = true;
dfs(0, 0);
System.out.println(cnt);
}
}
์ ํ์ ์ธ DFS์ฝ๋์ธ๋ฐ, ์ด๊ฑธ๋ก ์ ์ถํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ์ ๋ ๊น?
์ ๋ ฅ์ ํ์ธํด์ผ๋๋ค.
์ฒซ์งธ ์ค์๋ ์ง๋์ ์ธ๋ก์ ํฌ๊ธฐ M๊ณผ ๊ฐ๋ก์ ํฌ๊ธฐ N์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด์ด ๋ค์ M๊ฐ ์ค์ ๊ฑธ์ณ ํ ์ค์ N๊ฐ์ฉ ์์์๋ถํฐ ์ฐจ๋ก๋ก ๊ฐ ์ง์ ์ ๋์ด๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. M๊ณผ N์ ๊ฐ๊ฐ 500์ดํ์ ์์ฐ์์ด๊ณ , ๊ฐ ์ง์ ์ ๋์ด๋ 10000์ดํ์ ์์ฐ์์ด๋ค.
map์ ์ต๋ ํฌ๊ธฐ๊ฐ 500x500์ด๊ณ , ๊ฐ ์นธ์์ 4๋ฐฉํฅ์ผ๋ก ์ฌ๊ทํ์์ ํ๋ค. 25000๊ฐ์ ์นธ์์ 4๋ฐฉํฅ ์ฌ๊ทํ์์ธ๋ฐ, ๊ทธ๋ผ ์ฌ๊ท๋ ์ต๋ 4^25000๋ฒ ๋ ์ ์๊ฒ๋๋ค. 4^20์ด ๋๋ต 1์กฐ์ด๋๊น ๋ง๋ ์๋๊ฒ ํฐ ์ซ์๊ฐ ๋์จ๋ค. ๋น์ฐํ ์ฌ๊ท์คํ์ด ํฐ์ง๋ค๊ณ ๋ด๋ ๋๊ณ , ์คํ์ด ํฐ์ง์ง์๋๋ผ๋ ์์ฒญ๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํ์ด์ผํ ๊น?
๊ฐ ์ ์๋ ๋ด๋ฆฌ๋ง๊ธธ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐ ์นธ dp[ci][cj] ์ ๋ด์ผ๋ฉด์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
class Main {
static int[] di = { -1, 0, 1, 0 };
static int[] dj = { 0, 1, 0, -1 };
static int n, m;
static int[][] map;
static int[][] dp;
public static int dfs(int ci, int cj) {
if (ci == n - 1 && cj == m - 1) {
return 1;
}
if (dp[ci][cj] != -1)
return dp[ci][cj]; // ๋ฐฉ๋ฌธํ์ผ๋๊น ๊ณ์ฐํ์ง์๊ณ ๋ฐํํ๋ค.
dp[ci][cj] = 0; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
for (int i = 0; i < 4; i++) {
int ni = di[i] + ci;
int nj = dj[i] + cj;
if (isValid(ci, cj, ni, nj)) {
dp[ci][cj] += dfs(ni, nj);
}
}
return dp[ci][cj]; // ์ฌ๊ทํธ์ถ์ ๋ค ํ๊ณ ๋์ ๋ฐํํด์ค๋ค.
}
public static boolean isValid(int ci, int cj, int ni, int nj) {
return ni < n && nj < m && ni >= 0 && nj >= 0 && map[ci][cj] > map[ni][nj];
}
public static void main(String args[]) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
dp = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = -1;
}
}
dfs(0, 0);
System.out.println(dp[0][0]); // ์ด๋ฌ๋ฉด ์ต์ข
์ ์ผ๋ก๋ dp[0][0]์ ๊ฐ์ด ๋์ ๋์ด์์ ๊ฒ์ด๋ค.
}
}
๊ทธ๋ฅ ์ฝ๋๋ง ๋ณด๋ฉด ์ด๊ฑธ๋ก ๋ญ ๋จ์ถ์ด ๋๊ฒ ๋ ์ถ์๋ฐ, ์ํ๊ณต๊ฐํธ๋ฆฌ๋ก ๋น๊ตํ๋ฉด ํ ๋ฌ๋ผ์ง๋ค.
graph TD;
A((0,0))
A --> B((1,0))
B --> C((2,0))
A --> D((0,1))
D --> E((1,1))
E --> F((1,2))
F --> G((1,3))
G --> H((2,3))
H --> I((3,3))
I --> J((3,4))
J --> K((3,5))
K --> L((3,6))
L --> M((3,7))
์ด๊ฒ DP๋ฐฐ์ด์ ํ์ฉํ ๋์ ์ํ๊ณต๊ฐ ํธ๋ฆฌ์ด๊ณ
์๋๊ฐ DP๋ฐฐ์ด ์์ด ํธ์ถํ ๋์ ์ํ๊ณต๊ฐ ํธ๋ฆฌ๋ค.
graph TD;
A((0,0))
A --> B((1,0))
B --> C((2,0))
C --> D((3,0))
B --> E((1,1))
E --> F((2,1))
F --> G((3,1))
E --> H((1,2))
H --> I((2,2))
I --> J((3,2))
H --> K((1,3))
K --> L((2,3))
L --> M((3,3))
K --> N((0,3))
N --> O((1,3))
O --> P((2,3))
N --> Q((0,4))
Q --> R((1,4))
R --> S((2,4))
Q --> T((0,5))
T --> U((1,5))
U --> V((2,5))
T --> W((0,6))
W --> X((1,6))
X --> Y((2,6))
W --> Z((0,7))
๋๊ฐ์ด (3,7) ์ ์ฐพ์๊ฐ๋ ์ฝ๋์ธ๋ฐ, ์์ฒญ๋ ์ฐจ์ด๊ฐ ์๋ค, DFS๋ง ์ฌ์ฉํ ์ฝ๋๋ ์ฌ์ง์ด ํธ๋ฆฌ ์์ ๋์ค์ง๋ ์์๋ค. ์ด ์ฐจ์ด๋ฅผ ํ์ฉํ๋ฉด ๋ ๊น์ด ๋ค์ด๊ฐ๋ ๊ฑธ ์ค๊ฐ์ ์ฐ์ฐ๊ฐ์ ๋ถ๋ฌ์ ๋์ด๋ฒ๋ฆด ์ ์๊ฒ๋๋ฏ๋ก ์์ฒญ๋ ์ฌ๊ทํธ์ถ์ ๋ง์ ์ ์๊ฒ๋๋ค. ๋น์ทํ ๋ฌธ์ ๋ก ์์ฌ์์ด ํ๋ค๋ฌธ์ ๊ฐ ์๋ค.
https://www.acmicpc.net/problem/1937
1937๋ฒ: ์์ฌ์์ด ํ๋ค
n × n์ ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค. ์์ฌ์์ด ํ๋ค๋ ์ด๋ค ์ง์ญ์์ ๋๋๋ฌด๋ฅผ ๋จน๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณณ์ ๋๋๋ฌด๋ฅผ ๋ค ๋จน์ด ์น์ฐ๋ฉด ์, ํ, ์ข, ์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ๊ณณ์
www.acmicpc.net
๋ด๋ฆฌ๋ง๊ธธ๊ณผ ๊ฑฐ์ ๋น์ทํ ์ ํ์ธ๋ฐ ์ข ๋ ๋ณต์กํ๋ค. base case๊ฐ ๋์ด์ ๋ป์ด๋๊ฐ๋ฉด ์๋๋ ๊ฒ ์กฐ๊ฑด์ด๊ณ , ๊ฒฐ๊ณผ๊ฐ์ผ๋ก๋ ๊ฐ์ฅ depth๊ฐ ๊น์ ๊ฒฝ์ฐ์ depth๋ฅผ ์ถ๋ ฅํด์ผํ๋ค.
๊ทธ๋ผ ์ด๋ฒ์๋ ์ต๋ ๊ธธ์ด๊ฐ ์ถ๋ฐ์ง์ธ dp[ci][cj]์ ์ ์ฅ๋๋๋ก ์ค๊ณํ๋ฉด ๋๋ค. ์ด๋ํ ๋๋ง๋ค ํ์นธ์ฉ ๋๋ ค์ ๋ค์ด๊ฐ๋ฉด ๋๋ค.
import java.io.*;
import java.util.*;
class Main {
static int[] di = { -1, 0, 1, 0 };
static int[] dj = { 0, 1, 0, -1 };
static int n;
static int[][] map;
static int[][] dp;
static int max = -1;
public static int dfs(int ci, int cj) {
if (dp[ci][cj] != -1)
return dp[ci][cj]; // ๋ฐฉ๋ฌธํ์ผ๋๊น ๊ณ์ฐํ์ง์๊ณ ๋ฐํํ๋ค.
dp[ci][cj] = 1; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
for (int i = 0; i < 4; i++) {
int ni = di[i] + ci;
int nj = dj[i] + cj;
if (isValid(ci, cj, ni, nj)) {
dp[ci][cj] = Math.max(dp[ci][cj], 1 + dfs(ni, nj)); // ํ์์ ์งํํ๊ณ ์ต๋๊ฐ์ ์ ์ฅํ๋ค.
}
}
return dp[ci][cj];
}
public static boolean isValid(int ci, int cj, int ni, int nj) {
return ni < n && nj < n && ni >= 0 && nj >= 0 && map[ci][cj] < map[ni][nj];
}
public static void main(String args[]) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
map = new int[n][n];
dp = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = -1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dfs(i, j);
max = Math.max(max, dp[i][j]);
}
}
System.out.println(max);
}
}
๊ฑฐ์ ๋น์ทํ ๋ฌธ์ ์์ง๋ง base case ์ค์ ํ๋ ๊ฒ ์ฝ๊ฐ ๋ฌ๋ผ์ ํ์ด๋ณผ ๋งํ ๋ฌธ์ ์๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ๏ธ์ด์งํ์ - BinarySearch(feat. ํ๋ผ๋ฉํธ๋ฆญ ์์น) (0) | 2024.07.16 |
---|---|
์ ๋ ฌ - Comparable<T> ~ compareTo(T o1) (0) | 2024.05.29 |
์ ๋ ฌโ๏ธ- ์์์ ๋ ฌ (0) | 2024.04.04 |
Bruteforce๐คฎ - ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2024.03.31 |
์ต๋จ๊ฑฐ๋ฆฌ๐ - ๋ค์ต์คํธ๋ผ Dijkstra (1) | 2024.03.31 |