

이 문제는 푸는 방법이 다음 두 가지가 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] arr;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
arr = new int[N][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken()); // T
arr[i][1] = Integer.parseInt(st.nextToken()); // P
}
result = 0;
DFS(0, 0);
System.out.println(result);
}
static void DFS(int i, int p) {
if (i >= arr.length) {
result = Math.max(p, result);
return;
}
if (i + arr[i][0] <= arr.length) // 상담이 가능한 기간일 때 p 더해 백트래킹(dfs)
DFS(i+arr[i][0], p+arr[i][1]);
else // 상담 기간이 퇴사일을 넘어갈 때 p는 더해지지 않고 종료조건으로 감
DFS(i+arr[i][0], p);
DFS(i+1, p); // 1일부터 N일까지 각각 상담을 시작할 모든 경우 탐색
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] T = new int[N];
int[] P = new int[N];
int[] DP = new int[N+1];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}
for (int i = N-1; i >= 0; i--) {
if (i+T[i] > N) // i에 상담할 수 없을 때
DP[i] = DP[i+1];
else // i에 상담할 수 있을 때
DP[i] = Math.max(DP[i+1], P[i]+DP[i+T[i]]); // max(i에 상담하지 않았을 때, i에 상담했을 때)
}
System.out.println(DP[0]);
}
}
