250516 Dance Dance Revolution

Jongleee·2025년 5월 16일
0

TIL

목록 보기
900/970
private static final int MAX = 5;

public static void main(String[] args) throws IOException {
	final int diff = '0';
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	String input = br.readLine();
	int length = input.length() - 1;

	if (length == 0) {
		System.out.print("0");
		return;
	}

	int size = length >> 1;
	int[] chart = new int[size];
	for (int i = 0; i < size; i++) {
		chart[i] = input.charAt(i << 1) - diff;
	}

	int[][] indexMap = new int[MAX][MAX];
	int index = 0;
	for (int i = 0; i < MAX; i++) {
		for (int j = i + 1; j < MAX; j++) {
			indexMap[i][j] = index++;
		}
	}

	int[][] dp = new int[index][size];
	System.out.print(getMinimumMoves(0, chart[0], 1, chart, size, indexMap, dp) + 2);
}

private static int getMinimumMoves(int left, int right, int depth, int[] chart, int size, int[][] indexMap,
		int[][] dp) {
	if (depth == size) {
		return 0;
	}

	int idx = indexMap[Math.min(left, right)][Math.max(left, right)];
	if (dp[idx][depth] != 0) {
		return dp[idx][depth];
	}

	int note = chart[depth];
	if (note == left || note == right) {
		dp[idx][depth] = getMinimumMoves(left, right, depth + 1, chart, size, indexMap, dp) + 1;
		return dp[idx][depth];
	}

	int moveLeft = getMinimumMoves(note, right, depth + 1, chart, size, indexMap, dp) + getMoveCost(left, note);
	int moveRight = getMinimumMoves(left, note, depth + 1, chart, size, indexMap, dp) + getMoveCost(right, note);
	dp[idx][depth] = Math.min(moveLeft, moveRight);
	return dp[idx][depth];
}

private static int getMoveCost(int from, int to) {
	if (from == 0) {
		return 2;
	}
	return (Math.abs(from - to) & 1) == 1 ? 3 : 4;
}

출처:https://www.acmicpc.net/problem/2342

0개의 댓글