https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
풀이 과정
각각의 계단에는 점수가 적혀있고, 계단 1칸 건너기, 1칸 건너뛰고 건너기 두 개의 선택이 가능할 때 세 칸 연속으로 계단을 건너지 않고 마지막 계단을 밟을 때의 가능한 최대 점수 값을 구하는 문제이다.
각 계단을 올랐을 때 가능한 최대 점수 값을 기록해가면서 DP로 해결할 수 있다.
i번째 계단에서의 가능한 점수 최댓값 D[i], i번째 계단을 건널 때의 점수 값 A[i]에서
D[i] = max(D[i-2], D[i-3] + A[i-1]) + A[i]가 성립한다.
i-2번째 계단에서 2칸 건너오거나, i-1번째 계단에서 1칸 건너오거나 해야 하는데 i-1번째 계단에서 건너오는 경우는 i-2번째 계단을 밟지 않았다는 것을 점화식에 반영해 주어야 하기 때문에 D[i] = D[i-3] + A[i-1] + A[i]의 식이 된다.
DP는 언제나 초기 값 설정에 유의해주어야 한다. D[2]는 A[0] + A[2], A[1] + A[2] 둘 중 큰 수로 지정해주자.
소스 코드
#include <iostream>
using namespace std;
int D[301];
int A[301];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int stair, num;
cin >> stair;
for (int i = 0 ; i < stair; i++) {
cin >> num;
A[i] = num;
}
D[0] = A[0];
D[1] = D[0] + A[1];
D[2] = max(D[0] + A[2], A[1] + A[2]);
for (int i = 3; i < stair; i++) {
D[i] = max(D[i-2], D[i-3] + A[i-1]) + A[i];
}
cout << D[stair-1] << '\n';
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 2606 - 바이러스 [C++] (0) | 2022.07.14 |
---|---|
백준 9663 - N-Queen [C++] (0) | 2022.07.14 |
백준 11659 - 구간 합 구하기 4 [C++] (0) | 2022.07.14 |
백준 1932 - 정수 삼각형 [C++] (0) | 2022.07.14 |
백준 1753 - 최단경로 [C++] (0) | 2022.07.13 |