문제
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
문제 요약
계단 오르기 게임은 계단 시작점에서 꼭대기에 위치한 도착점까지 가는 게임이다.
계단에는 해당 계단 층의 점수가 쓰여 있고, 밟으면 그 점수를 획득한다.
< 규칙>
1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다.
2. 연속된 세 계의 계단을 모두 밟아서는 안된다. (단, 시작점은 포함 x)
3. 마지막 도착 계단은 반드시 밟아야 한다.
오를 계단 정보를 받고, 게임에서 얻을 수 있는 총 점수의 최댓값을 출력한다.
코드
#include <iostream>
#define MAX 300
using namespace std;
int scores[MAX + 1]; // i번째 계단을 밟을 경우 얻을 수 있는 점수
int n;
int dp[MAX + 1]; // dp[i]: i번째 계단까지 왔을 때, 얻을 수 있는 최대 점수
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> scores[i];
}
dp[1] = scores[1];
dp[2] = scores[1] + scores[2];
for (int i = 3; i <= n; i++) {
dp[i] = max(dp[i - 2] + scores[i], dp[i - 3] + scores[i - 1] + scores[i]);
}
cout << dp[n];
}
코드 설명
i번째 계단까지 왔을 때, 얻을 수 있는 최대 점수는 두 가지 경우에 발생할 수 있다.
1. 직전에 계단 두 칸을 올라온 경우
= i - 2번째 계단까지 얻을 수 있는 최대 점수에 i번째 계단을 밟았을 때 얻을 수 있는 점수를 더한 값
=> dp[i - 2] + scores[i]
2. 직전에 계단 한 칸을 올라온 경우 (그 전에는 두 칸을 올라왔어야 함)
= i - 3번째 계단까지 얻을 수 있는 최대 점수에 i - 1번째 계단을 밟고, i번째 계단을 밟았을 때 얻을 수 있는 점수를 더한 값
=> dp[i - 3] + scores[i - 1] + scores[i]
이 두가지 경우의 수 중 더 큰 점수가 i번째 계단까지 왔을 때, 얻을 수 있는 최대 점수이다. (dp[i])
'Algorithm Problems > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준/C++] 10844번: 쉬운 계단 수 (0) | 2024.03.24 |
---|---|
[백준/C++] 1912번: 연속합 (1) | 2024.03.23 |
[백준/C++] 1932번: 정수 삼각형 (0) | 2024.03.05 |
[백준/C++] 12865번: 평범한 배낭 (2) | 2024.02.12 |
[백준/Python] 2193번: 이친수 (1) | 2024.01.04 |