Algorithm🐰/λ°±μ€€

[λ°±μ€€] 2579 계단 였λ₯΄κΈ° DP

Jouureee 2021. 6. 13. 14:49

문제 :

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;
}