Problem Solving/Baekjoon
[백준] 12869 뮤탈리스크 - Dynamic Programming / Java
graycode
2022. 10. 20. 23:11
• 문제 링크
12869번: 뮤탈리스크
1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int[] scv;
static int[][][] dp;
static int[][] pattern = {{-9, -3, -1}, {-9, -1, -3}, {-3, -9, -1}, {-3, -1, -9}, {-1, -9, -3}, {-1, -3, -9}};
static int minCnt = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
scv = new int[3];
dp = new int[61][61][61];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++)
scv[i] = Integer.parseInt(st.nextToken());
recur(scv, 0);
bw.write(String.valueOf(minCnt));
bw.flush();
}
private static void recur(int[] scv, int cnt) {
if (minCnt <= cnt)
return;
if (dp[scv[0]][scv[1]][scv[2]] != 0 && dp[scv[0]][scv[1]][scv[2]] <= cnt)
return;
if (scv[0] == 0 && scv[1] == 0 && scv[2] == 0) {
minCnt = Math.min(minCnt, cnt);
return;
}
dp[scv[0]][scv[1]][scv[2]] = cnt;
for (int i = 0; i < 6; i++)
recur(new int[]{Math.max(scv[0] + pattern[i][0], 0), Math.max(scv[1] + pattern[i][1], 0), Math.max(scv[2] + pattern[i][2], 0)}, cnt + 1);
}
}