https://www.acmicpc.net/problem/14501
코드설명
동적계획법(Dynamic Programming, DP) 문제입니다.
처음에는, for문을 활용해서 가능한 날짜 조합을 모두 만드는 방식으로 진행하려 했습니다. 해당 방식도 물론 가능합니다.
for문과 재귀함수의 사용방법과 원리는 똑같으므로, 좀 더 친밀한 재귀함수를 사용했습니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static int N, K, M, L;
private static int[] arr;
private static int answer = 0;
private static int[] T, P;
private static int[] cache = new int[16];
private static PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Arrays.fill(cache, -1);
N = Integer.parseInt(st.nextToken());
T = new int[N+1];
P = new int[N+1];
for(int i=1;i<=N;i++) {
st = new StringTokenizer(br.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}
answer = func(1);
System.out.println(answer);
}
private static int func(int t) {
if(t > N) return 0;
if(cache[t] != -1) return cache[t];
int ret = 0;
//안사고 넘어가는 경우.
ret = func(t + 1) + 0;
if(t + T[t] <= N+1)
ret = Math.max(ret, func(t + T[t]) + P[t]);
return cache[t] = ret;
}
// private static int func(int t) {
// if(t >= N) return 0;
//
// int ret = 0;
// if(t == -1) {
// for(int i=1; i<=N; i++) {
// ret = Math.max(ret, func(i) + 0);
// }
// }
//
// }
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17175 피보나치는 지겨웡~ - 동적계획법(DP, Dynamic Programming) JAVA (0) | 2024.08.04 |
---|---|
[백준] 15975 화살표 그리기 - 정렬(Sort) JAVA (0) | 2024.08.03 |
[백준] 14494 다이나믹이 뭐예요? - 동적계획법(Dynamic Programming, DP) JAVA (0) | 2024.08.03 |
[백준] 14235 크리스마스 선물 - 우선순위큐(PriorityQueue, Collections.reverseOrder()) JAVA (0) | 2024.08.02 |
[백준] 13417 카드 문자열 - 그리디(Greedy, 탐욕법) JAVA (0) | 2024.08.02 |