https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
풀이
더보기
먼저 DP배열을 정의합니다.
DP[i번째발판에 있는 상태] //i번째까지 도달하는데 얻은 최대 점수 |
점프를 통해서 i번째 발판을 밟는 방법은 2가지가 있습니다.
1. (i-3)번 발판을 밟고 -> (i-1)번 발판을 밟고 -> i번 발판을 밟는다.
2. (i-2)번 발판을 밟고 -> i번 발판을 밟는다.
해당 방법들로 점화식을 짜게 된다면
Arr : 계단의 점수를 담은 배열 DP : i번계단까지 밟았을때의 최대 점수 |
DP[i] = max(DP[i - 3] + Arr[i - 1] + Arr[i], DP[i - 2] + Arr[i]); |
1번 방법에서 점프를 두 번이나 하면서 발판을 밟는 이유는
3개의 계단을 연속해서 밟으면 안되기 때문입니다!!
(i-1) -> i 나 (i-2) -> (i-1) -> i 순서로 이동하면 3개의 계단을 연속해서 밟은 것이 되기 때문입니다.
코드
더보기
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define float double
#define MAX 10001
int N;
int DP[MAX]; //i번 계단까지 밟았을때의 최대 점수
int Arr[MAX]; //i번 계단의 점수
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
std::cout.tie(NULL);
cin >> N;
for (int i = 1; i <= N; i++)
cin >> Arr[i];
DP[0] = 0;
DP[1] = Arr[1];
DP[2] = Arr[1] + Arr[2];
for (int i = 3; i <= N; i++)
//DP 점화식
DP[i] = max(DP[i - 3] + Arr[i - 1] + Arr[i], DP[i - 2] + Arr[i]);
cout << DP[N] << endl;
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------
질문은 언제나 환영합니다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 1062 가르침 (0) | 2021.07.08 |
---|---|
백준 21967 세워라 반석 위에 (0) | 2021.06.18 |
백준 11062 카드게임 (0) | 2021.06.03 |
백준 2342번 Dance Dance Revolution (0) | 2021.06.03 |
백준 18133번 가톨릭대학교에 워터 슬라이드를?? (0) | 2021.06.03 |