https://www.acmicpc.net/problem/15486
https://www.acmicpc.net/problem/14501
위 실버 3의 퇴사 문제로 시작되는 퇴사 시리즈의 두번째 문제이다.
문제 조건은 퇴사1 문제와 같으나, 의 범위가 최대 150만으로 증가한 부분이
차이점으로 그리디 방식으로는 주어진 제한 조건을 통과하기가 어려운 구조였다.
로직은 마지막날부터 최대값을 구하기 위해 연산을 수행하며 아래의 과정을 따른다.
next
)를 구한다.next
가 일하는 기간(N
)을 넘어갈 경우, 이전까지 계산한 최대값dp[i+1]
)을 dp[i]
로 갱신한다. dp[N]
의 경우도 유연하게 처리하기N+2
로 설정하고 next
의 제한 조건도 N+1
dp[N+1]
)과 현재 상담을dp[i]
를 갱신한다.로직의 시간 복잡도는 단순히 두번의 반복문을 돌리므로 이 되고 이는
문제의 시간 제한 조건인 2초를 무난히 통과한다.
import java.util.*;
import static java.lang.Integer.parseInt;
public class Main {
static final int MAX = 1_500_000;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = parseInt(in.nextLine());
int[] times = new int[MAX + 2];
int[] prices = new int[MAX + 2];
StringTokenizer st;
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(in.nextLine());
times[i] = parseInt(st.nextToken());
prices[i] = parseInt(st.nextToken());
}
int[] dp = new int[MAX + 2];
for (int i = N; i > 0; i--) {
int next = i + times[i];
if (next > N + 1) {
dp[i] = dp[i + 1];
} else {
dp[i] = Math.max(dp[i + 1], dp[next] + prices[i]);
}
}
System.out.println(dp[1]);
in.close();
}
}