끄적끄적 코딩
article thumbnail
Published 2023. 1. 25. 21:54
[Java] 백준 14501번 퇴사 알고리즘

다이나믹 프로그래밍 문제입니다.

각 날짜마다 할 수 있는 상담이 주어졌을때 최대한의  이익을 계산하는 문제입니다.
점화식을 세울 수 있습니다.

DP[i+day[i]] = Math.max(DP[i+day[i]], DP[i] + pay[i]);

DP[현재 날의 상담 기간을 계산했을 때 끝나는 날]
= max(DP[현재 날의 상담 기간을 계산했을 때 끝나는 날], DP[현재 날까지 계산된 값] + pay[현재 날 상담을 통해 얻는 값])

DP[i+1] = Math.max(DP[i+1], DP[i]);

다음날의 계산된 결과 값, 오늘날의 계산된 결과 값 중 큰 값을 다음날 값에 삽입

위의 식들을 통해 최종적으로 가장 많이 얻을 수 있는 금액을 찾아낼 수 있습니다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] day = new int[n+1];
		int[] pay = new int[n+1];
		int[] DP = new int[n+1];
		for(int i=0; i<n; ++i) {
			day[i] = sc.nextInt();
			pay[i] = sc.nextInt();
		}
		
		for(int i=0; i<n; ++i) {
			if(i+day[i] <= n) {
				DP[i+day[i]] = Math.max(DP[i+day[i]], DP[i] +pay[i]);							
			}
			DP[i+1] = Math.max(DP[i+1], DP[i]);
		}
		
		System.out.println(DP[n]);
	}

}

'알고리즘' 카테고리의 다른 글

[Java] 백준 3190번 뱀  (0) 2023.01.29
[Java] 백준 14502번 연구소  (0) 2023.01.26
[Java] 백준 2596번 비밀편지  (0) 2023.01.25
[Java] 백준 15683번 감시  (0) 2023.01.24
[Java] 백준 17478번 재귀함수가 뭔가요?  (0) 2023.01.24

검색 태그