728x90
https://www.acmicpc.net/problem/2579
문제 풀이
문제에서 마지막 계단은 무조건 밟아야 한다는 조건을 주었다. 그렇다면 주어진 경우는
1. 마지막 계단의 전 계단을 밟는 경우
2. 마지막 계단의 전전 계단을 밟는 경우
dp 배열은 n번째 계단에서 나올 수 있는 최댓값을 저장한다. 그렇다면 점화식은 주어진 경우에 따라
1번 경우 → N번째 계단 + (N-1)번째 계단 + (N-3)번째 계단까지의 최댓값
2번 경우 → N번째 계단 + (N-2)번째 계단까지의 최댓값
즉, DP[n-3] + stairs[n] + stairs[n-1] 와 DP[n-2] + stairs[n]을 비교해서 더 큰 값을 저장하면 된다.
느낀 점
점화식만 구할 수 있다면 간단한 문제인 것 같다. 하지만 찾지 못해서 엄청 헤맸다. 계속 풀이법이 백트래킹으로만 접근이 되서 내 접근법에 문제가 조금 많이 있는 것 같다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int stairs[301] = { 0, };
int dp[301] = { 0, };
int main() {
cin >> n;
for (int i = 1; i <= n;i++) {
cin >> stairs[i];
}
dp[1] = stairs[1];
dp[2] = stairs[1] + stairs[2];
dp[3] = max(stairs[1] + stairs[3], stairs[2] + stairs[3]);
for (int i = 4;i <= n;i++) {
dp[i] = max(dp[i - 3] + stairs[i - 1] + stairs[i], dp[i - 2] + stairs[i]);
}
cout << dp[n];
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 10844번 : 쉬운 계단 수 (0) | 2021.06.18 |
---|---|
[C++] 백준 1463번 : 1로 만들기 (0) | 2021.06.18 |
[C++] 백준 1932번 : 정수 삼각형 (0) | 2021.06.02 |
[C++] 백준 1149번 : RGB거리 (0) | 2021.06.01 |
[C++] 백준 9461번 : 파도반 수열 (0) | 2021.05.29 |
댓글