코딩테스트준비/다시볼문제
백준 2579. 계단 오르기 (DP)
haeullee
2023. 7. 9. 20:18
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
문제 풀이는 바킹독의 실전 알고리즘 0x10강 - 다이나믹 프로그래밍을 참고했다.
1. 특징
1) DP
2. 구현 포인트(DP문제)
1) 테이블 정의하기
D[i][j] = 현재까지 j개의 계단을 연속해서 밟고 i번째 계단까지 올라섰을 때 점수 합의 최댓값, 단 i번째 계단은 반드시 밟아야 함
2) 점화식 찾기
D[k][1] = max(D[k-2][1] + D[k-2][2]) + S[k]
D[k][2] = D[k-1][1] + S[k]
3) 초기값 정하기
D[1][1] = S[1], D[1][2] = 0
D[2][1] = S[2], D[2][2] = S[1] + S[2]
3. 코드
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <limits.h>
#include <algorithm>
using namespace std;
int n;
int arr[304];
int ans[304][3];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> arr[i];
}
ans[1][1] = arr[1];
ans[1][2] = 0;
ans[2][1] = arr[2]; //두번째 전에서 온경우
ans[2][2] = arr[1] + arr[2]; //첫번째 전에서 온경우
for(int i = 3; i <= n; i++)
{
ans[i][1] = max(ans[i-2][1], ans[i-2][2]) + arr[i];
ans[i][2] = ans[i-1][1] + arr[i];
}
cout << max(ans[n][1], ans[n][2]);
}