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();
}
}