๋ฐฑ์ค 11049๋ฒ : ํ๋ ฌ ๊ณฑ์ ์์ | JAVA
๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ
๋ฌธ์ ๋ฅผ ์ฝ๊ณ ํ๋ ฌ์ ํฌ๊ธฐ๋ฅผ ์ง์ ๊ณฑํด๋ณด๋ฉด์, ์ด ๋ฌธ์ ๋ ์ค๋ณต๋ ๊ณ์ฐ์ด ๋ง๊ณ ๋ฒ์๋ฅผ ์ง์ ํด์ ๊ฐ์ ๊ธฐ์ตํด์ผ ํ๊ธฐ์ ๋ฌด์กฐ๊ฑด 2์ฐจ์ dp๋ก ํ์ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋ฐ๋ฐ ๊ตฌํ ํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ ๋ค.. ์ด๋ฐ์ ๋ฐ ์๊ฐ์ ํ๋ค๋ณด๋ ํธ๋ฆฌ๊น์ง๋ ๊ทธ๋ฆฌ๊ฒ ๋์๋๋ฐ ํ๋ ฌ์ ํฌ๊ธฐ๋ฅผ ๋ด์ ๋ฐฐ์ด์ ๋ง์๋๋ก ์์ ํ๋ค๋ณด๋ ๋ง์์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ์๋์ค๋๋ผ.. ์์ง ์ข๋ ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค!
๐ ํ์ด
์์ฌ์ด ๋ง์์ ์ฌ๋ ค๋ณด๋ ,, ๋์ ํธ๋ฆฌ ,, ์ฌ๊ท๋ก ํ์ด๋ณด๊ณ ์ถ์๋ฐ ์ฌ๋์ ํด๋ด์ผ๊ฒ ๋ค.
์๋ฌดํผ ๊ฒฐ๊ตญ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ dp๋ก ํ์์ผ๋,, ํด๋น ํ์ด๋ฅผ ์ค๋ช ํด๋ณด์.
์ด ๋ฌธ์ ์์ ์ค์ํ ๊ฒ์ dp[i][j]์ ๊ฐ์ ์ฑ์๋๊ฐ๋ ๊ฒ์ธ๋ฐ,
dp[i][j]๋ i๋ฒ์งธ ํ๋ ฌ์์ j๋ฒ์งธ ํ๋ ฌ๊น์ง์ ํฌ๊ธฐ์ ๊ณฑ ์ค ์ต์๊ฐ์ ๋ด๋๋ค.
์๋์ ์ฝ๋์์, matrixSolution() ํจ์ ์์ ์ฒซ๋ฒ์งธ for๋ฌธ์์๋ ์ธ์ ํ ๋ ๊ฐ์ ํ๋ ฌ์ ํฌ๊ธฐ์ ๊ณฑ์ ์ ์ฅํด์ค๋ค.
์ธ์ ํ ๋ ํ๋ ฌ์ ํฌ๊ธฐ์ ๊ณฑ์ ๊ฐ์ด ํ๋์ด๋ฏ๋ก ๋ฐ๋ก ์ ์ฅ ๊ฐ๋ฅํ๊ธฐ์ ๋ถ๋ฆฌํด์ค๋ค.
๋๋ฒ์งธ for๋ฌธ์์๋ gap์ ์ด๊ธฐ๊ฐ์ 2๋ก ๋์ด, i๋ฒ์งธ ํ๋ ฌ๋ถํฐ i+gap๋ฒ์งธ ํ๋ ฌ๊น์ง์ ํฌ๊ธฐ์ ๊ณฑ์ ๊ณ์ฐํด์ค ์ ์๋๋ฐ,
ํด๋น ๋ฒ์์์ k๋ผ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฒ์๋ฅผ ๋๋์ด ๋น๊ตํด์ผ ํ๋ค.
์ด๋์์ ๋๋๋์ง์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.. (๋งค์ฐ ๋น์ฐ)
์ด๋ dp[i][j]์๋ ๊ธฐ์กด dp[i][j] ๊ฐ๊ณผ dp[i][k] + dp[k+1][j] + matrix[i][0] * matrix[k][1] * matrix[j][1] ์ค ๋ ์์ ๊ฐ์ ์ ์ฅํ๋ค.
dp[i][k] + dp[k+1][j] + matrix[i][0] * matrix[k][1] * matrix[j][1]
์์ ์์ ๋ง๋ค๊ธฐ๊ฐ ๊ฐ์ฅ ์ด๋ ค์ ๋๋ฐ,
๋ ํ๋ ฌ dp[i][k]์ dp[k+1][j]๊ฐ ๋ง๋ค์ด์ง๋ฉด์ ๊ณ์ฐ๋ ๊ณฑ์ ํฉ๊ณผ ๊ทธ ๋ ํ๋ ฌ์ ํฌ๊ธฐ์ ๊ณฑ์ ๋ํด์ค๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก dp[0][N-1]์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] matrix;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // ํ๋ ฌ ๊ฐ์
// ํ๋ ฌ ์
๋ ฅ
matrix = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
matrix[i][0] = Integer.parseInt(st.nextToken());
matrix[i][1] = Integer.parseInt(st.nextToken());
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
int result = matrixSolution();
System.out.println(result);
}
public static int matrixSolution() {
int[][] dp = new int[N][N];
// ์ธ์ ํ ๋ ํ๋ ฌ์ ๊ณฑ์ ๊ณ์ฐํด์ dp์ ์ ์ฅ
for(int i = 0; i < N - 1; i++) {
dp[i][i+1] = matrix[i][0] * matrix[i][1] * matrix[i+1][1];
}
// ์ธ์ ํ์ง ์์ ๋ ํ๋ ฌ์ ๊ณฑ์ ๊ณ์ฐํด์ dp์ ์ ์ฅ
for(int gap = 2; gap < N; gap++) {
for(int i = 0; gap + i < N; i++) {
int j = i + gap;
dp[i][j] = Integer.MAX_VALUE;
for(int k = i; k < j; k++) {
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k+1][j] + matrix[i][0] * matrix[k][1] * matrix[j][1]);
}
}
}
return dp[0][N-1];
}
}
https://www.acmicpc.net/problem/11049
11049๋ฒ: ํ๋ ฌ ๊ณฑ์ ์์
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ํ๋ ฌ์ ๊ณฑํ๋๋ฐ ํ์ํ ๊ณฑ์ ์ฐ์ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ์ ๋ต์ 231-1 ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋ํ, ์ต์ ์ ์์๋ก ์ฐ์ฐํด๋ ์ฐ์ฐ ํ์๊ฐ 231-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ
www.acmicpc.net