Post

DP - Dynamic Programming

๐Ÿค” DP ๋ž€?

  • Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)

    ์‚ฌ์‹ค ์ด๋ฆ„์€ ๋ฉ‹์žˆ์–ด ๋ณด์—ฌ์„œ ์ง€์€ ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹
  • ๊ฐ ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ์‚ฌ์šฉ(๋ฉ”๋ชจ์ œ์ด์…˜)ํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์˜ ์ค‘๋ณต์„ ํ”ผํ•˜์—ฌ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.
  • ํ•ต์‹ฌ์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ๊ทธ ๋‹ต๋“ค์„ ์ €์žฅํ•ด๋‘๊ณ  ์žฌํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿคจ ์žฌ๊ท€์™€์˜ ์ฐจ์ด

  • ์žฌ๊ท€ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ํ’€์–ด๋‚˜๊ฐ€์ง€๋งŒ ๊ธฐ์กด ๋‹ต์„ ์žฌํ™œ์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
  • ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์˜ˆ๋กœ ์žฌ๊ท€๋กœ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด f(n) = f(n-1) + f(n-2) ์ด๋‹ค.
  • ๋งŒ์•ฝ 100๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด f(1)์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” ์„ธ๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ๊ต‰์žฅํžˆ ๋งŽ๋‹ค.
  • ๋ฐ˜๋ฉด์— DP๋กœ ๊ตฌํ•˜๋ฉด f(1)์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” ๋‹จ ํ•œ๋ฒˆ์ด๋‹ค.


๐Ÿค— DP์˜ ์‚ฌ์šฉ ์กฐ๊ฑด

  • DP๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ 2๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.
  1. Overlapping Subproblems(๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ)
  2. Optimal Substructure(์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ)


[Overlapping Subproblems(๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ)]

  • DP๋Š” ๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆ„๊ณ  ๊ทธ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์žฌํ™œ์šฉํ•ด์„œ ์ „์ฒด ๋‹ต์„ ๊ตฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค.

DP ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ

  • ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™์ผํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋˜์–ด์„œ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ  DP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


[Optimal Substructure(์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ)]

DP ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

  • ์œ„ ๊ทธ๋ฆผ์—์„œ ์„œ์šธ์—์„œ ๋ถ€์‚ฐ๊นŒ์ง€ ์ œ์ผ ์งง์€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ์šธ-๋Œ€์ „ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’, ๋Œ€์ „-๋ถ€์‚ฐ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ๊ฐ ๊ตฌํ•˜์—ฌ ํ•ฉ์น˜๋ฉด ๋œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ ๊ฐ’์ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ๋ผ๊ณ  ํ•œ๋‹ค.


๐Ÿ˜ค DP๋Š” ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ•˜๋Š”๊ฐ€

  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ DP๋Š” ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ๊นŒ?

    DP ๋ฌธ์ œ์ž„์„ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ, ๊ตฌํ˜„ ๋ฐฉ์‹ ๋“ฑ์€ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

  • ์‹ ์ž… ๊ณต์ฑ„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๋“ค์˜ ๋‚œ์ด๋„๋Š” ์•„๋ฌด๋ฆฌ ๋†’์•„๋„ ๊ณจ๋“œ 1์ด๊ณ , DP ๋ฌธ์ œ๋“ค์˜ ๊ฒฝ์šฐ ๊ณจ๋“œ3 ์ •๋„๊ฐ€ ์ตœ๋Œ€์ธ ๊ฒƒ ๊ฐ™๋‹ค.
  • DP ๋ฌธ์ œ๋“ค์˜ ํ•ต์‹ฌ์€ ์ ํ™”์‹์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ด๋‹ค.
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋…ธํŠธ๋กœ ํ•„๊ธฐํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ DP ๋ฌธ์ œ์ž„์„ ์•ˆ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋…ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ์ ธ๋ณด๋Š”๊ฒŒ ๊ฐ€์žฅ ๋น ๋ฅธ ํ•ด๊ฒฐ๋ฒ•์ด๋ผ๊ณ  ๋ณธ๋‹ค.
  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋ถ€ํ„ฐ 4~5๊ฐœ ์ •๋„์˜ ๊ฒฝ์šฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋”ฐ์ ธ๋ณด๊ณ  ์ ํ™”์‹์„ ๊ตฌํ•œ๋‹ค์Œ ์ฝ”๋“œ์— ๋…น์—ฌ๋‚ด๋Š” ์—ฐ์Šต์„ ํ•œ๋‹ค๋ฉด ์‹ค์ „์—์„œ ํฐ ๋ฌธ์ œ ์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


BOJ 2133 - ํƒ€์ผ ์ฑ„์šฐ๊ธฐ (๊ณจ๋“œ 4)

2133-ํƒ€์ผ ์ฑ„์šฐ๊ธฐ

  • 3xN ํฌ๊ธฐ์˜ ๋ฒฝ์„ 2x1, 1x2 ๋‘ ์ข…๋ฅ˜์˜ ํƒ€์ผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • n์ด ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ๋ฒฝ์˜ ํฌ๊ธฐ 3xn ๋„ ํ™€์ˆ˜์ด๋ฏ€๋กœ ํฌ๊ธฐ๊ฐ€ 2์ธ ํƒ€์ผ๋“ค๋กœ๋Š” ์ฑ„์šธ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0์ด๋‹ค.
  • n = 2, 4, 6, 8 ์ผ ๋•Œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ง์ ‘ ๋”ฐ์ ธ๋ณธ๋‹ค.


[n=2]

n=2

  • n=2 ์ธ ๊ฒฝ์šฐ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฐ–์— ์—†๋‹ค.


[n=4]

n=4

  • n=2์ธ ๊ฒฝ์šฐ๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฒฝ์šฐ 9๊ฐ€์ง€
  • ์ด์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ ๊ฒฝ์šฐ 2๊ฐ€์ง€
  • ์ด 11๊ฐ€์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.


[n=6]

n=6

  • n=4์ธ ๊ฒฝ์šฐ์—์„œ n=2์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณฑํ•œ 33๊ฐ€์ง€
  • n=4์˜ ์˜ˆ์™ธ ๊ฒฝ์šฐ์™€ n=2 ๊ฒฝ์šฐ๋ฅผ ๊ณฑํ•œ 6๊ฐ€์ง€
  • n=6์˜ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ 2๊ฐ€์ง€
  • ์ด 41๊ฐ€์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.
  • ์ ์  ๊ทœ์น™์ด ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


[n=8]

n=8

  • n=6์ธ ๊ฒฝ์šฐ์—์„œ n=2์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณฑํ•œ 123๊ฐ€์ง€
  • n=4์˜ ์˜ˆ์™ธ ๊ฒฝ์šฐ์™€ n=4 ๊ฒฝ์šฐ๋ฅผ ๊ณฑํ•œ 22๊ฐ€์ง€
  • n=6์˜ ์˜ˆ์™ธ ๊ฒฝ์šฐ์™€ n=2 ๊ฒฝ์šฐ๋ฅผ ๊ณฑํ•œ 6๊ฐ€์ง€
  • n=8์˜ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ 2๊ฐ€์ง€
  • ์ด 153๊ฐ€์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.


๊ทœ์น™ ์ •๋ฆฌ

  1. n-2 ๊ฒฝ์šฐ์˜ ์ˆ˜์— n=2์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜(3)์„ ๊ณฑํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.
  2. ์ด์ „ ๊ฒฝ์šฐ๋“ค์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ๊ฒฝ์šฐ๋“ค์— ๋นˆ ๊ณต๊ฐ„์„ ๊ณฑํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.
  3. n >= 4 ์—์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ 2๊ฐ€์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.
    • ์ด๋ฅผ ์‹์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. f(n-2) * 3
  2. f(n-4) * 2 + f(n-6) * 2 + ... + f(2) * 2
  3. 2
=> f(n) = 3f(n-2) + 2(f(n-4)+...+f(2)) + 2 (n>=4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.*;
import java.util.*;

public class Main {
    static FastReader scan = new FastReader();
    static StringBuilder sb = new StringBuilder();

    static int n;
    static int[] dp;

    public static void main(String[] args) {
        input();
        solve();
    }

    static void input() {
        n = scan.nextInt();
    }

    static void solve() {

        if (n == 1) {
            System.out.println(0);
            return;
        }

        dp = new int[n+1];

        dp[0] = 0;
        dp[1] = 0;
        dp[2] = 3;

        for (int i = 3; i <= n; i++) {
            if (i % 2 == 1) {
                dp[i] = 0;
            }else{
                dp[i] += 2 + dp[i - 2] * 3;
                for (int j = i-4; j >= 2; j -= 2) {
                    dp[i] += dp[j]*2;
                }
            }
        }

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

    static class FastReader {
        .
        .
        .
    }
}


DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ


๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด

DP๋Š” ํ•˜์œ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.