[백준] 2579번 계단 오르기 / C++
#문제
#풀이
#include <iostream>
using namespace std;
int stair[301];
int arr[301];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
int x;
cin >> x;
stair[i] = x;
}
arr[1] = stair[1];
arr[2] = stair[1] + stair[2];
arr[3] = stair[3] + max(stair[1], stair[2]);
for (int i = 4; i <= n; ++i)
{
arr[i] = stair[i] + max(arr[i - 3] + stair[i - 1], arr[i - 2]);
}
cout << arr[n];
return 0;
}
#정리
n개의 계단이 주어진다. 각 계단은 점수를 가지고 있으며, 점수가 없는 0번 계단부터 1칸씩 또는 2칸씩 오를 수 있다. 연속으로 1칸씩 3계단 이상 오를 수 없으며, 마지막 계단은 꼭 밟아야 한다. 모든 규칙을 준수하여 올랐을 때, 가장 높은 점수를 출력하는 문제다.
각 계단의 최고 점수를 출력한다면…
- n = 1, 계단 1칸
- n = 2, 계단 1칸 + 계단 2칸
- n = 3, 계단 1칸 + 계단 3칸 vs 계단 2칸 + 계단 3칸(연속으로 3칸 올라갈 수 없으니까)
- n = 4, 계단 1칸 + 계단 2칸 + 계단 4칸 vs 계단 1칸 + 계단 3칸 + 계단 4칸
- n = 5, 계단 3칸(점수) + 계단 5칸 vs 계단 1칸(점수) + 계단 4칸 + 계단 5칸 위의 규칙을 사용해 DP를 만들어 해결. 보자마자 DP로 해결해야 되겠다는 건 느꼈지만, 점화식을 도출하는 데 시간이 걸렸다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: