๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DFS,BFS

[๋ฐฑ์ค€] ํฌ๋„์ฃผ ์‹œ์‹

by syLim___ 2024. 11. 25.
728x90

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

 

 

๋ฌธ์ œ์— ๋‚˜์˜จ ์˜ˆ์‹œ ์ž…์ถœ๋ ฅ์„ ๊ฐ€์ง€๊ณ  20๋ถ„์ •๋„ ๊ณ ๋ฏผํ•ด๋ณด๋‹ˆ ๊ทœ์น™์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ธธ์ด๊ฐ€ n์ธ ์ผ์ฐจ์› ๋ฐฐ์—ด wines์—๋Š” ์™€์ธ์˜ ์–‘์„ ์ €์žฅํ•œ๋‹ค.
๊ธธ์ด๊ฐ€ n์ธ ์ผ์ฐจ์› ๋ฐฐ์—ด dp์—๋Š” ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ํฌ๋„์ฃผ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

ํฌ๋„์ฃผ ์ž”์ด k๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ(k>=3) ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์•„๋ž˜ ์ค‘ ์ตœ๋Œ“๊ฐ’์ด๋‹ค.

  1. k๋ฒˆ์งธ ํฌ๋„์ฃผ, k-1๋ฒˆ์งธ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹œ๋Š” ๊ฒฝ์šฐ
    • ์ด ๊ฒฝ์šฐ ์ตœ๋Œ€๊ฐ’์€ k๋ฒˆ์งธ ํฌ๋„์ฃผ ์–‘ + k-1๋ฒˆ์งธ ํฌ๋„์ฃผ ์–‘ + k-3๋ฒˆ์งธ๊นŒ์ง€ ๋งˆ์‹  ํฌ๋„์ฃผ ์ตœ๋Œ“๊ฐ’
    • ์ฆ‰, dp[k] = wines[k] + wines[k-1] + dp[k-3]
  2. k๋ฒˆ์งธ ํฌ๋„์ฃผ, k-2๋ฒˆ์งธ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹œ๋Š” ๊ฒฝ์šฐ
    • ์ด ๊ฒฝ์šฐ ์ตœ๋Œ€๊ฐ’์€ k๋ฒˆ์งธ ํฌ๋„์ฃผ ์–‘ + k-2๋ฒˆ์งธ๊นŒ์ง€ ๋งˆ์‹  ํฌ๋„์ฃผ ์ตœ๋Œ€๊ฐ’
    • ์ฆ‰, dp[k] = wines[k] + dp[k-2]
  3. k๋ฒˆ์งธ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    • ์ด ๊ฒฝ์šฐ ์ตœ๋Œ€๊ฐ’์€ k-1๋ฒˆ์งธ๊นŒ์ง€ ๋งˆ์‹  ํฌ๋„์ฃผ ์ตœ๋Œ€๊ฐ’
    • ์ฆ‰, dp[k] = dp[k-1]

์ฒ˜์Œ์—๋Š” DP ๋ฐฐ์—ด์„ 2์ฐจ์›์œผ๋กœ ์„ค์ •ํ•ด 3๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•ด๊ฐ€๋ฉฐ ํ’€์—ˆ๋‹ค.
๋ฐฐ์—ด์ด ๋ณต์žกํ•œ๋งŒํผ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”์™€ ๊ฐ’์„ค์ •์„ ์ž˜๋ชปํ•˜์—ฌ ์ž๊พธ ์˜ค๋‹ต ํŒ์ •์„ ๋ฐ›์•˜๋‹ค.
์ƒ๊ฐํ•ด๋ณด๋‹ˆ DP ๋ฐฐ์—ด์€ ์ผ์ฐจ์›์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์œ„์˜ 3๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ“๊ฐ’๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ์—
DP๋ฐฐ์—ด์„ ์ผ์ฐจ์›์œผ๋กœ ๋ฐ”๊ฟ” ๋‹ค์‹œ ํ’€์—ˆ์Šต๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            int n = Integer.parseInt(reader.readLine());
            int[] wines = new int[n];
            for (int i = 0; i < n; i++) {
                wines[i] = Integer.parseInt(reader.readLine());
            }
            if (n <= 2) {
                System.out.println(Arrays.stream(wines).sum());
                return;
            }

            int[] dp = new int[n];
            dp[0] = wines[0];
            dp[1] = wines[0] + wines[1];
            dp[2] = Math.max(dp[1], Math.max(wines[0] + wines[2], wines[1] + wines[2]));

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

            System.out.println(dp[n-1]);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
728x90