Problem Solving/Baekjoon

[백준] 1495 기타리스트 - Dynamic Programming / Java

graycode 2022. 5. 10. 23:45

 문제 링크

 

1495번: 기타리스트

첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

www.acmicpc.net

 

 풀이 과정

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int s = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		int[] dp = new int[m + 1];
		for (int i = 0; i <= m; i++) {
			dp[i] = -1;
		}

		dp[s] = 0;
		String[] input = br.readLine().split(" ");

		for (int i = 1; i <= n; i++) {
			int v = Integer.parseInt(input[i - 1]);
			List<Integer> list = new ArrayList<>();

			for (int j = 0; j <= m; j++) {
				if (dp[j] == i - 1) {
					int up = j + v;
					int down = j - v;

					if (0 <= up && up <= m)
						list.add(up);
					if (0 <= down && down <= m)
						list.add(down);
				}
			}

			for (int j : list) {
				dp[j] = i;
			}
		}

		int max = -1;
		for (int i = 0; i <= m; i++) {
			if (dp[i] == n)
				max = Math.max(max, i);
		}

		bw.write(max + "\n");
		bw.flush();
	}

}