알고리즘/BOJ

[BOJ] 15486. 퇴사 2

재담 2022. 4. 27. 01:15

문제 원본 : https://www.acmicpc.net/problem/15486

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[n + 1][2];
        int[] dp = new int[n + 1];
        StringTokenizer st;

        for (int i = 1; i <= n; ++i) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());

            dp[i] = Math.max(dp[i], dp[i - 1]);

            int tmp = i + arr[i][0] - 1;
            if (tmp <= n) {
                dp[tmp] = Math.max(dp[tmp], dp[i - 1] + arr[i][1]);
            }
        }

        bw.write(String.valueOf(dp[n]));

        bw.close();
        br.close();
    }
}
  • 다이내믹 프로그래밍 문제
  • Max(전 날까지 번 금액 + 오늘부터 상담해서 벌 수 있는 금액)을 구하면 해결된다.