본문 바로가기
문제풀이

[백준] 퇴사2 Java

by AndoneKwon 2021. 4. 15.
//이전에 풀었는데 다시 풀었다.
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void input(int arr[][], int n) throws IOException {
        StringTokenizer st;

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

    public static void main(String[] args) throws IOException {
        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[n][2];
        long[] dp = new long[n + 1];

        long beforeMax = 0;
        long answer = 0;

        Arrays.fill(dp, 0);
        input(arr, n);

        for (int i = 0; i < n; i++) {
            //검사하는 시점에서의 최고값을 업데이트 해준다. 이후 더할 때 이값을 이용해야 한다.(최대를 구하는 것이니까..)
            beforeMax = Math.max(beforeMax,dp[i]);
            if (arr[i][0] + i <= n) {
                int next = arr[i][0] + i;
                //dp에 저장된 값과 이전 최대값 
                dp[arr[i][0] + i] = Math.max(dp[next], arr[i][1] + beforeMax);
            }
        }

        for(long item : dp) {
            answer = Math.max(answer, item);
        }

        bw.write(Long.toString(answer));
        bw.flush();
        bw.close();
    }
}