사용한 것
- 점화식을 세워 풀이하기 위한 bottom-up
풀이 방법
- 뒤에서 부터 계산
- i 번째 날의 예약이 기한 안에 (n + 1보다 같거나 작음) 끝낼 수 없으면 dp[i] = dp[i + 1]
- 끝낼 수 있으면 p[i] + dp[i + t[i]]와 dp[i + 1] 중 큰 값을 dp[i]에 저장
- 전자는 i 번째 날의 예약을 채택하는 것, 후자는 채택하지 않는 것
코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] t = new int[n + 1];
int[] p = new int[n + 1];
for (int i = 1; i <= n; i++) {
String[] line = br.readLine().split(" ");
t[i] = Integer.parseInt(line[0]);
p[i] = Integer.parseInt(line[1]);
}
int[] dp = new int[n + 2];
for (int i = n; i >= 1; i--) {
if (i + t[i] > n + 1) {
dp[i] = dp[i + 1];
} else {
dp[i] = Math.max(p[i] + dp[i + t[i]], dp[i + 1]);
}
}
System.out.println(dp[1]);
}
}