N일 동안 상담을 진행한다.
각 날 별로 걸리는 기간(T)과 상담을 했을 때 받을 수 있는 금액(P)으로 이루어져 있다
예를 들어 1일에 T = 3이고 P = 10이라고 해보자.
1일에 잡혀있는 상담은 총 3일이 걸리며 상담 시 받을 수 있는 금액은 10이다.
T가 1보다 클 수 있기 때문에 모든 상담을 할 수는 없다. 예를 들어 1일 상담을 하기로 결정하면 2, 3일은 상담을 할 수 없다.
또한 N + 1일에는 회사에 없기 때문에 그것도 고려해서 상담을 결정해야 한다.
상담 일정을 적절히 골라 최대 수익을 구하라.
일단 확실한 건 마지막 N일의 상담은 T가 1이 아니면 선택할 수 없다.
해야 할 일은 그날 상담을 할지 말지를 결정해야 한다.
우선은 완전탐색을 고려할 수 있다. 그런데 이 경우 중복된 계산이 빈번하게 등장한다.
이 중복 된 계산은 저장해 두면 속도 향상이 될 것이다.
결국에는 DP 문제이다. 최대 수익을 저장하면 될 것이다.
그런데 이전의 선택이 다음의 선택에 영향을 주고 있다.
그렇다면 뒤에서부터 접근하면 날짜 결정 이후의 결과에 영향을 주지 않을 것이다.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static FastReader scan = new FastReader();
static int N;
static Consult[] consults;
static class Consult {
int T;
int P;
public Consult(int day, int price) {
this.T = day;
this.P = price;
}
}
static void input() {
N = scan.nextInt();
consults = new Consult[N + 1];
for (int i = 1; i <= N; i++) {
int day = scan.nextInt();
int price = scan.nextInt();
consults[i] = new Consult(day, price);
}
}
public static void main(String[] args) {
input();
int[] DP = new int[N + 2];
for (int day = N; day >= 1; day--) {
if (day + consults[day].T <= N + 1) {
// day의 상담이 가능한 경우 -> 현재 상담 + 최대 수익 vs 현재 상담 x
DP[day] = Math.max(consults[day].P + DP[day + consults[day].T], DP[day + 1]);
} else {
DP[day] = DP[day + 1];
}
}
System.out.println(DP[1]);
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException{
br = new BufferedReader(new FileReader(s));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
| BOJ 14503 - 로봇 청소기 (2) | 2024.10.10 |
|---|---|
| BOJ 14502 - 연구소 (0) | 2024.10.10 |
| BOJ 14500 - 테트로미노 (1) | 2024.10.09 |
| BOJ 14499 - 주사위 굴리기 (2) | 2024.10.09 |
| BOJ 13458 - 시험 감독 (1) | 2024.10.09 |