์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐฑ์ค€(BOJ)] 11052๋ฒˆ: ์นด๋“œ ๊ตฌ๋งคํ•˜๊ธฐ (Dynamic Programming, C++)

PROGRAMMING/Algorithm

by koharin 2021. 2. 23. 18:56

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“ ๋ฌธ์ œํ’€์ด ๊ณผ์ •


  • ์ฃผ์–ด์ง„ ์˜ˆ์ œ์—์„œ ์นด๋“œ 1์žฅ, 2์žฅ, ... , N์žฅ์„ ์„ ํƒํ•  ๋•Œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๊ธˆ์•ก์„ ๊ตฌํ•ด์„œ ์ผ๋ฐ˜ํ™”๋œ ์‹์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • DP[i]: ์นด๋“œ๊ฐ€ i์žฅ์ผ ๋•Œ, ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๊ธˆ์•ก
  • N = 4, P = {1, 5, 6, 7} ์ด๋ผ๊ณ  ํ•˜์ž.
  • DP[1]์€ ์นด๋“œ 1์žฅ์„ ์„ ํƒํ–ˆ์„ ๋•Œ ์ง€๋ถˆ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๊ธˆ์•ก์œผ๋กœ, 1์žฅ์ผ ๋•Œ ๊ธˆ์•ก 1์›์ด ์ตœ๋Œ€ ๊ธˆ์•ก์ด๋‹ค. DP[1] = 1
  • DP[2]๋Š” ์นด๋“œ 2์žฅ์„ ์„ ํƒํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํฐ ์ง€๋ถˆ ๊ธˆ์•ก์œผ๋กœ, 1์žฅ*2, ๋˜๋Š” 2์žฅ์งœ๋ฆฌ๋ฅผ ์‚ด ์ˆ˜ ์žˆ๋‹ค. 2์™€ 5 ๋‘˜ ์ค‘์—์„œ 5๊ฐ€ ๋” ํฌ๋ฏ€๋กœ DP[2] = 5 (DP[i]๋ฅผ ๊ฐ€์ ธ๊ฐ)
  • DP[3]์€ 3์žฅ ์งœ๋ฆฌ ์„ ํƒ(6), ๋˜๋Š” 2์žฅ์งœ๋ฆฌ + 1์žฅ์งœ๋ฆฌ(6), 1์žฅ์งœ๋ฆฌ์™€ 2์žฅ์งœ๋ฆฌ(6) ์ค‘์ด๋ฏ€๋กœ DP[3] =6
  • DP[4]์˜ ๊ฒฝ์šฐ, DP[4-1]+A[1] (3์žฅ์งœ๋ฆฌ+1์žฅ=7), DP[4-2]+A[2](2์žฅ์งœ๋ฆฌ+2์žฅ์งœ๋ฆฌ=10), DP[4-3]+A[3](1์žฅ์งœ๋ฆฌ+3์žฅ์งœ๋ฆฌ=7), DP[4-4]+A[4](4์žฅ์งœ๋ฆฌ 1๊ฐœ=7) ์ค‘์—์„œ ์ด๋ฏ€๋กœ DP[4] = 10์ด๋‹ค.
  • N = 4์ผ ๋•Œ, ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๊ธˆ์•ก์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, DP[4]์ธ 10์ด ๋‹ต์ด ๋œ๋‹ค.

 

DP[i] = max(DP[i], DP[i-j]+A[j])

๋”ฐ๋ผ์„œ ์ ํ™”์‹์€ ์œ„์™€ ๊ฐ™์ด ๋˜๋ฉฐ, ์ดˆ๊ธฐ์— ๋ชจ๋“  DP[i]=0์ด๊ณ , j์— ๋Œ€ํ•œ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ๋ฉด์„œ DP[i]๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ๊ธฐ์ค€์˜ DP[i]์™€ j์ผ ๋•Œ ๊ตฌํ•˜๋Š” DP[i-j]+A[j] ์ค‘์—์„œ ๋” ํฐ ๊ฐ’์„ DP[i]๋กœ ๊ฐ€์ ธ๊ฐ„๋‹ค.

 

 

๐Ÿ’ป C++ ์ œ์ถœ์ฝ”๋“œ


#include <stdio.h>
#include <deque>
#include <algorithm>
using namespace std;

int main(){
    int N;
    scanf("%d", &N);
    deque<int> P(N+1,0);
    deque<int> DP(N+1,0);

    for(int i=1; i<=N; i++) scanf("%d", &P[i]);
    
    for(int i=1; i<=N; i++){
        for(int j=1; j<=i; j++){
            DP[i] = max(DP[i], DP[i-j]+P[j]); //์ดˆ๊ธฐ DP[i]=0
        }
    }
    printf("%d", DP[N]);    
}

 

 

๐Ÿ‘ ๊ฒฐ๊ณผ


728x90
๋ฐ˜์‘ํ˜•

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ