문제링크 : https://www.acmicpc.net/problem/14501
문제풀이
동적계획법으로 풀 수 있는 문제이다.
1일까지 상담했을 때 최대 금액, 2일까지 상담했을 때 최대 금액을 차례로 더하여 저장해놓는다.


1) 1일까지 상담했을 때 최대 금액은 10이다.

2) (2일을 포함하여) 2일까지 상담했을 때 최대 금액은 20이다.
왜냐하면 1일에 상담을 받으면 3일이 걸려 2일에는 상담을 받을 수 없기 때문이다.

3) (3일을 포함하여) 3일까지 상담했을 때 최대 금액은 10이다.
왜냐하면 1일에 상담을 받으면 3일이 걸려 3일에는 상담을 받을 수 없고,
마찬가지로 2일에도 상담을 받으면 5일이 걸려 3일에 상담을 받을 수 없다.

4) (4일을 포함하여) 4일까지 상담했을 때 최대 금액은 30이다.

5) (5일을 포함하여) 5일까지 상담했을 때 최대 금액은 45이다.

6) (6일을 포함하여) 6일까지 상담했을 때 최대 금액은 70이다.
하지만 6일에 상담을 하게 되면 4일이 걸려 퇴사일까지 끝내지 못하므로 제외한다.
7일도 마찬가지.
7) 결국 1일, 4일, 5일 상담을 받는 경우가 최대가 된다.
---
1일까지 상담 + 5일 상담
4일까지 상담(1일, 4일 상담) + 5일 상담
이 경우, 4일까지 상담을 받는 다는 말이 곧 1일, 4일에 상담을 받는다는 뜻이라 1일이 포함되어 있다.
그래서 1일 + 5일 상담하는 경우는 굳이 안더해도 될 것 같은데 어떻게 제외해야 할지 모르겠다.
따로 체크를 해놓자니 더 복잡해 질 것 같고.. 좀 더 생각해봐야 겠다.
소스코드
package baekjoon;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class P14501 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] schedule = new int[2][N];
int max = 0;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
schedule[0][i] = T;
schedule[1][i] = P;
int sum = 0;
// 현재 지점까지 최대 이익
for (int j = 0; j < i; j++) {
if (j + schedule[0][j] <= i) {
sum = sum < schedule[1][j] ? schedule[1][j] : sum;
}
}
schedule[1][i] = P + sum;
// 최대 이익
if (i + T <= N) {
max = max < schedule[1][i] ? schedule[1][i] : max;
}
}
System.out.println(max);
br.close();
}
}
'Algorithm > 문제풀이' 카테고리의 다른 글
| [백준] 4447번: 좋은놈 나쁜놈 (0) | 2019.07.12 |
|---|---|
| [백준] 7785번: 회사에 있는 사람 (0) | 2019.07.12 |
| [백준] 2217번: 로프 (2) | 2019.07.12 |
| [백준] 11812번: K진 트리 (0) | 2019.07.12 |
| [백준] 1057번: 토너먼트 (0) | 2019.07.05 |