알고리즘&자료구조/문제

[BOJ] 2579 계단오르기 C++

Nakuri 2023. 1. 19. 04:01
728x90

개요

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

실버급 DP 문제다.

본문

풀이

2차원 배열인 dp에 점수를 저장했다.

dp[계단번호][연속이동횟수]

중복되는 부분은 함수로 처리했다.

코드

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
constexpr int RANGE = 302;

int GetMaxDP(int* dp) {
	int max = (dp[1] > dp[2]) ? dp[1] : dp[2];
	return max;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	// 최대 값을 기억할 변수
	int dp[RANGE][3] = { 0 };
	int stair[RANGE] = { 0 };
	int n = 0;

	cin >> n;
	for (int i = 1; i <= n; i++) 
		cin >> stair[i];
	
	// 초기값
	dp[1][1] = stair[1];
	for (int i = 2; i <= n; i++)
	{
		// 1회 연속 이동의 경우, -2계단의 이동 값 중 큰 값을 더함
		dp[i][1] = GetMaxDP(dp[i - 2]) + stair[i];
		// 2회 연속 이동의 경우, -1계단의 1회 연속 이동 값을 더함
		dp[i][2] = dp[i - 1][1] + stair[i];
	}

	cout << GetMaxDP(dp[n]);
}

결론

풀이를 생각하는 데에 꽤 많은 시간이 소요됐다.

DP 문제는 계속해서 많이 풀어봐야 할 것 같다.

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 2178 미로탐색 C++  (0) 2023.02.03
[BOJ] 2644 촌수계산 C++  (0) 2023.02.03
[BOJ] 2309 일곱 난쟁이 C++  (0) 2023.02.02
[BOJ] 1260 DFS와 BFS C++  (0) 2023.02.02
[BOJ] 2606 바이러스 C++  (0) 2023.02.02