๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

2156 - ํฌ๋„์ฃผ ์‹œ์‹

๋ฌธ์ œ: boj.kr/2156
๋‚ ์งœ: 08/30 (๊ธˆ)
์„ฑ๊ณต์—ฌ๋ถ€: X

 

n = 1์ผ ๋•Œ

 

n = 2์ผ ๋•Œ

 

n = 3์ผ ๋•Œ

 

n = 4์ผ ๋•Œ

 

n = 5์ผ ๋•Œ

 

n = 1 or 2์ผ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด 1์„ ๋จน๊ณ  1, 2๋ฅผ ๋จน๋Š”๊ฒŒ ์ตœ๋Œ€๊ฐ’์ด๋‹ค.

 

๊ทธ๋Ÿผ ์ง„์งœ ๋กœ์ง์˜ ์‹œ์ž‘์€ n = 3์ผ ๋•Œ๋ถ€ํ„ฐ์ด๋‹ค. n์ด 3์ผ ๋•Œ๋ถ€ํ„ฐ ๋ณด๋ฉด 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋‚˜๋‰œ๋‹ค.

 

n์„ ๋จน์ง€์•Š๊ณ  ์ด์ „(n-1)๊นŒ์ง€ ๋จน์€ ๊ฒƒ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜, n-2๊นŒ์ง€์˜ ๋จน์€ ๊ฒƒ์„ ์„ ํƒํ•˜๊ณ  n์„ ๋จน๊ฑฐ๋‚˜, n-3๊นŒ์ง€์˜ ๋จน์€ ๊ฒƒ์„ ์„ ํƒํ•˜๊ณ  n-1, n์˜ ์™€์ธ์„ ๋จน๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด

 

Math.max(dp[n-1], dp[n-2] + wine[n], dp[n-3] + wine[n-1] + wine[n])

 

๋ฌธ์ œ๊ฐ€ ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ด์„œ dp[n-2] + wine[n], dp[n-3] + wine[n-1] + wine[n] ์‹์œผ๋กœ๋งŒ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ผญ ๋งˆ์ง€๋ง‰ ์™€์ธ์„ ๋จน์ง€ ์•Š์•„๋„ ์ตœ๋Œ“๊ฐ’ ์ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์† 3์ž”์„ ๋จน์ง€ ๋ชปํ•œ๋‹ค๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์™€์ธ์„ ๋จน๋Š”๋‹ค๋Š” ์„ ํƒ์ด ๊ผญ ๊ทธ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ“๊ฐ’์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

์ฝ”๋“œ

import java.io.*;

public class Main {
    // ์‹œ๊ฐ„์ œํ•œ 2์ดˆ, ๋ฉ”๋ชจ๋ฆฌ์ œํ•œ 128MB

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[] wine = new int[n+1];
        for (int i = 1; i <= n; i++) wine[i] = Integer.parseInt(br.readLine());

        int[] dp = new int[n+1]; dp[0] = 0; dp[1] = wine[1];
        if (n >= 2) dp[2] = wine[1] + wine[2];

        for (int i = 3; i <= n; i++) {
            dp[i] = Math.max(dp[i-2] + wine[i], dp[i-3] + wine[i-1] + wine[i]);
            dp[i] = Math.max(dp[i], dp[i-1]);
        }

        System.out.println(dp[n]);
    }
}