๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2579 ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ DP

by Jouureee 2021. 6. 13.

๋ฌธ์ œ :

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

 

2579๋ฒˆ: ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๊ฒŒ์ž„์€ ๊ณ„๋‹จ ์•„๋ž˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๊ณ„๋‹จ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒŒ์ž„์ด๋‹ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์ผ์ •ํ•œ ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”๋ฐ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด ๊ทธ ๊ณ„๋‹จ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ 

www.acmicpc.net

 

๋ถ„์„ :

 

๊ณ„๋‹จ์ด ์žˆ์„ ์‹œ ๊ณ„๋‹จ์„ ์˜ค๋ฅด๋Š”๋ฐ ๊ทœ์น™์ด ์žˆ๋‹ค --> ์ ํ™”์‹์ด๊ตฐ


  1. ๊ณ„๋‹จ์€ ํ•œ ๋ฒˆ์— ํ•œ ๊ณ„๋‹จ์”ฉ ๋˜๋Š” ๋‘ ๊ณ„๋‹จ์”ฉ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•œ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด์„œ ์ด์–ด์„œ ๋‹ค์Œ ๊ณ„๋‹จ์ด๋‚˜, ๋‹ค์Œ ๋‹ค์Œ ๊ณ„๋‹จ์œผ๋กœ ์˜ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  2. ์—ฐ์†๋œ ์„ธ ๊ฐœ์˜ ๊ณ„๋‹จ์„ ๋ชจ๋‘ ๋ฐŸ์•„์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋‹จ, ์‹œ์ž‘์ ์€ ๊ณ„๋‹จ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  3. ๋งˆ์ง€๋ง‰ ๋„์ฐฉ ๊ณ„๋‹จ์€ ๋ฐ˜๋“œ์‹œ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค.

 

stairArr [i] = i๋ฒˆ์งธ ๊ณ„๋‹จ์˜ ๊ฐ’

d [i] = i๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ๋ฐŸ์•˜์„๋•Œ ์ด ๊ณ„๋‹จ์˜ ์ตœ๋Œ€ ๊ฐ’ 

 

 

1๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜์„๋•Œ ์ตœ๋Œ€ ๊ฐ’์€ ๊ณ„๋‹จ์„ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค --> d[0] = stairArr[0]

 

2๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜์„๋•Œ ์ตœ๋Œ€ ๊ฐ’์€ ๋‘ ๊ณ„๋‹จ์„ ๋ชจ๋‘ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค -> d[1] = stairArr[0] + stairArr[1]

 

3๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜์„๋•Œ ์ตœ๋Œ€ ๊ฐ’์€ 3๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๋ฐŸ๊ณ  1, 2 ์ค‘ ํ•˜๋‚˜์˜ ๊ณ„๋‹จ๋งŒ์„ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค -> max(stairArr[0], stairArr[1]) + stairArr[2]

 

๋”ฐ๋ผ์„œ ์ ํ™”์‹์€ 

๋งˆ์ง€๋ง‰ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜์„๋•Œ ์ „์ „ ๊ณ„๋‹จ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ฐ’๊ณผ // ๋งˆ์ง€๋ง‰ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜์„ ๋•Œ ์ „์ „์ „ ๊ณ„๋‹จ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ฐ’ + ์ „์ „ ๊ณ„๋‹จ์˜ ๊ฐ’์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ !!

 

        d[i] = max(d[i - 3] + stairArr[i - 1] + stairArr[i], d[i - 2] + stairArr[i])

 

๊ฐ€ ๋œ๋‹ค.

 

 

 

c++ ํ’€์ด :

//
//  2579_stairUp.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/06/13.
//

#include <stdio.h>
#include <iostream>
#include <algorithm>

using namespace std;
int Tcase;
int stairArr[301] = {0, };
int d[10001] = {0, };

int find_best_DP(){
    int answer = 0;
    d[0] = stairArr[0];
    d[1] = stairArr[0] + stairArr[1];
    d[2] = max(stairArr[0], stairArr[1]) + stairArr[2];
    
    for(int i = 3; i < Tcase; i++){
        //์ „์ „์ „ ๊ณ„๋‹จ๊นŒ์ง€ ์ตœ๋Œ€ ๊ฐ’ + ์ „ ๊ณ„๋‹จ + ๋งˆ์ง€๋ง‰ ๊ณ„๋‹จ, ์ „์ „ ๊ณ„๋‹จ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ฐ’ + ๋งˆ์ง€๋ง‰ ๊ณ„๋‹จ
        d[i] = max(d[i - 3] + stairArr[i - 1] + stairArr[i], d[i - 2] + stairArr[i]);
    }
    answer = d[Tcase - 1];
    return answer;
}

int main(){
    cin >> Tcase;
    for(int i = 0; i < Tcase; i++){
        cin >> stairArr[i];
    }
    
    cout << find_best_DP() << '\n';
    return 0;
}

๋Œ“๊ธ€