되면한다
백준 2579. 계단 오르기 (DP) 본문
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]);
}
'코딩테스트준비 > 다시볼문제' 카테고리의 다른 글
백준11055. 가장 큰 증가하는 부분 수열 (DP) (0) | 2023.07.10 |
---|---|
백준 1912. 연속합 (DP) (0) | 2023.07.10 |
프로그래머스. 가장 긴 팰린드롬 (구현) (0) | 2023.07.08 |
백준 16987. 계란으로 계란치기 (백트래킹) (0) | 2023.07.07 |
백준 15663. N과 M (9) (백트래킹) (0) | 2023.07.07 |
Comments