[백준, BOJ 15486] 퇴사 2

https://www.acmicpc.net/problem/15486


문제

컨설턴트로 일하는 백준이 사직을 앞두고 있다.

N+1에서 오늘부터 회사로. 남은 N일 동안 최대한 많은 상담을 하려고 노력합니다.

백준이는 비서에게 최대한 많은 상담 일정을 잡아달라고 부탁했고 비서는 어느 날 여러 사람과 상담 일정을 잡았다.

각 상담은 상담을 완료하는 데 걸리는 시간에 대한 $T_i$와 상담 완료 후 얻을 수 있는 $P_i$의 금액으로 구성됩니다.

N=7인 경우 다음과 같은 상담 계획을 고려한다.

1일 2일 3일 4일 5일 6일 7일 티피

1 일 2일 3 일 4 일 5 일 6 일 7 일
$T_i$ 5 하나 하나 2 4 2
$P_i$ 10 20 10 20 15 40 200

1일 예정된 상담은 총 3일간 진행되며 상담 시 받을 수 있는 금액은 10개입니다.

5일 예정된 상담은 총 2일 진행되며 15개를 받을 수 있습니다.

상담 기간이 하루 이상 길어질 수 있기 때문에 모든 상담이 진행되지는 않습니다.

예를 들어 1일에 상담을 했다면 2일과 3일에는 상담을 할 수 없습니다.

2일 상담이 있을 경우 3, 4, 5, 6일 예정된 상담에 참석하실 수 없습니다.

내가 N + 1에 있기 때문에. 그 날 회사에 없으면 6일이나 7일에도 상담을 할 수 없습니다.

퇴사 전 상담의 최대 편익은 1일차, 4일차, 5일차 상담이며, 이때의 효용은 10 + 20 + 15 = 45입니다.

상담이 제대로 이루어졌을 때 백준이 얻을 수 있는 최대 이익을 찾는 프로그램을 작성하시오.

기입

첫 번째 줄은 N(1 ≤ N ≤ 1,500,000)을 지정합니다.

$T_i$ 및 $P_i$는 두 번째 줄부터 N줄로 지정되며 공백으로 구분되고 1번째부터 N번째까지 순서대로 지정됩니다.

(1 ≤ $T_i$ ≤ 50, 1 ≤ $P_i$ ≤ 1,000)

누르다

첫 번째 줄에는 백준이 얻을 수 있는 최대 승리를 입력합니다.

728×90

예시 입력 1

7
3 10
5 20
1 10
1 20
2 15
4 40
2 200

예제 출력 1

45

샘플 입력 2

10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10

샘플 출력 2

55

샘플 입력 3

10
5 10
5 9
5 8
5 7
5 6
5 10
5 9
5 8
5 7
5 6

샘플 출력 3

20

샘플 입력 4

10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50

예제 출력 4

90

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String() args) throws Exception{

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		// N 입력
		int N = Integer.parseInt(br.readLine());
		
		int() profit = new int(N + 2); // 인덱스일 별 최대 수익
		int maxProfit = 0; // 현재 일수에서 벌어 놓은 있는 최대 이익
		int result = 0; // 가장 큰 이익
		
		for (int i = 1; i < N + 1; i++) { // 1일부터 N일까지
			// i일에 시작할 수 있는 일 정보를 입력 받고
			st = new StringTokenizer(br.readLine());
			int day = Integer.parseInt(st.nextToken());
			int pay = Integer.parseInt(st.nextToken());
			
			maxProfit = Math.max(maxProfit, profit(i - 1)); // 전날까지 벌어놓은 최대 이익을 구한다
			
			// i일에 일을 시작해서 i + day - 1에 일이 끝났을 때의 최대 이익을 profit에 저장한다
			if(i + day - 1 <= N) {
				profit(i + day - 1) = Math.max(profit(i + day - 1), maxProfit + pay);
				result = Math.max(result, profit(i + day - 1));
			}
		
		}
		
		System.out.println(result);
	}

}