[c++] BOJ 1149 :: RGB๊ฑฐ๋ฆฌ

๋‚œ์ด๋„ : ์‹ค๋ฒ„ 1

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 30๋ถ„

 

๋ฌธ์ œ

1149. RGB ๊ฑฐ๋ฆฌ

 

ํ’€์ด

  • ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ : ์–‘์ชฝ๊ณผ ์ƒ‰์ด ๊ฐ™์ง€ ์•Š์€ ์ง‘์œผ๋กœ ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’
  • ๋ถ€๋ถ„ ๋ฌธ์ œ : ํ˜„์žฌ ์ง‘์—์„œ ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’
  • ์žฌ๊ท€ (์ง‘์˜ index, ์ง‘์˜ ์ƒ‰๊น”) => ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’
  • ํ˜„์žฌ ์ง‘์„ ์น ํ•˜๋Š” ๋ฐ์— ๋“œ๋Š” ๋น„์šฉ์˜ ์ตœ์†Œ = 3๊ฐ€์ง€ ์ƒ‰ ์ค‘์˜ ์ตœ์†Œ = ์ง€๊ธˆ์˜ ๊ฐ’ + ์˜ค๋ฅธ์ชฝ ์ง‘์˜ ์ตœ์†Œ๊ฐ’
  • ์กฐ๊ฑด
    • ์˜ค๋ฅธ์ชฝ ์ง‘์€ ์ƒ‰์ด ๊ฒน์น˜์ง€ ์•Š์•„์•ผํ•จ
      • for๋ฌธ์—์„œ ์ƒ‰์ด ๊ฒน์น˜๋ฉด continue
    • ๋งˆ์ง€๋ง‰ ์ง‘์€ ์˜ค๋ฅธ์ชฝ ์ง‘์ด ์—†์œผ๋ฏ€๋กœ ๊ฐ€๊ฒฉ์ด ๊ทธ ์ž์ฒด๋กœ ์ตœ์†Œ๊ฐ’
      • memo์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ
  • DP ์‚ฌ์šฉ
    • ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ : ํ˜„์žฌ ์ง‘์˜ ์ƒ‰์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’
      • (index, color) => ์ตœ์†Œ
      • ์ €์žฅ์€ R, G, B color ๊ฐ๊ฐ์„ ๋ชจ๋‘ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ์—ด์ด 3์ธ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int N;
int house[1000][3];
int memo[1000][3];

int lowestValue(int idx, int color) {
    int value = 1e9;
    for (int i = 0; i < 3; i++) {
        if (color == i) // ์ด์ „ ์ƒ‰๊ณผ ๋˜‘๊ฐ™์ง€ ์•Š๊ฒŒ
            continue;
        int tmp;
        if (memo[idx+1][i] != -1) {
            // ์ด๋ฏธ ํ–ˆ์œผ๋ฉด
            tmp = house[idx][color] + memo[idx+1][i];
        }
        else {
            tmp = house[idx][color] + lowestValue(idx + 1, i);
        }
        value = tmp < value ? tmp : value; // RGB ์ค‘ ์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ
    }
    memo[idx][color] = value;
    return value;
}

int main() {
    // ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> N;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 3; j++) {
            cin >> house[i][j];
        }
    }

    // ์ดˆ๊ธฐํ™”
    memset(memo, -1, sizeof(memo));
    for (int i = 0; i < 3; i++) {
        // ๋งˆ์ง€๋ง‰ ์ง‘์€ ๋‹ค์Œ ์ง‘์ด ์—†์œผ๋ฏ€๋กœ memo ๋ฏธ๋ฆฌ ๋“ฑ๋ก
        memo[N - 1][i] = house[N - 1][i];
    }

    int answer = 1e9;
    for (int i = 0; i < 3; i++) {
        // ์ฒซ๋ฒˆ์งธ ์ง‘ RGB์— ๋Œ€ํ•ด ๋ชจ๋‘ ์กฐ์‚ฌ
        int tmp = lowestValue(0, i);
        answer = answer < tmp ? answer : tmp;
    }
    cout << answer;
}

 

๊ฒฐ๊ณผ

DP ๋ฌธ์ œ๋ฅผ ์ข€ ๋” ํ’€์–ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์•„์„œ ํ’€์–ด๋ดค๋Š”๋ฐ, ์ด์ „์— ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์„ ๋•Œ์™€ ๋น„๊ตํ•ด์„œ ํ›จ์”ฌ ๋‚˜์•„์กŒ๋‹ค.

๋ฐ˜์‘ํ˜•