알고리즘
BOJ: 계단 오르기(2679) [C++]
avocado8
2024. 3. 30. 15:13
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
한칸씩 세번 오르면 안된다는 데 꽂혀서 막 카운트 변수를 만들고 난리를 쳤으나 그럴 필요가 없는 문제였다
dp 문제는 식을 세우는 데 머리를 쓰는 게 맞는 듯함...
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, vector<int>& stair) {
//stair[0]: 1번째 계단 점수, stair[1]: 2번째 계단 점수...
//dp[1] : 1번째 계단을 오르는 최대점수, dp[2]: 2번째 계단을 오르는 최대점수...
vector<int> dp(n + 1, 0);
dp[1] = stair[0]; // 첫 번째 계단을 오르는 경우는 한가지
dp[2] = stair[0] + stair[1]; //두 번째 계단을 오르는 경우도 한가지 (점수가 자연수이니 0에서 2칸 가는것보다 1칸+2칸 가는게 무조건 더 크니까)
for (int i = 3; i <= n; i++) { //n번째 계단 밟아야 하니까 n까지
//n-2에서 2칸 오르기 or n-3에서 2칸 + 1칸 오르기 중 큰 값
dp[i] = max(dp[i - 2] + stair[i - 1], dp[i - 3] + stair[i - 2] + stair[i - 1]);
}
return dp[n];
;}
int main() {
int n;
cin >> n;
vector<int> stair(n, 0);
for (int i = 0; i < n; i++) {
cin >> stair[i];
}
int answer = solution(n, stair);
cout << answer;
return 0;
}