길게 쓰려고 쓰는 글은 아니고 그냥 이런 것도 있다 정도 정리해두려고 쓰는 글
먼저 나의 풀이
//계단 오르기 - 실버 3
#include <iostream>
#include <vector>
using namespace std;
void setDp(const vector<int>& arr, vector<vector<int>>& dp, int n) {
dp[0][0] = arr[0];
if (n == 1) return;
dp[1][0] = arr[0] + arr[1];
dp[1][1] = arr[1];
if (n == 2) return;
for (int i = 2; i < n; i++) {
dp[i][0] = dp[i-1][1] + arr[i];
dp[i][1] = max(dp[i-2][0], dp[i-2][1]) + arr[i];
}
}
int main() {
int n;
vector<int> arr;
vector<vector<int>> dp;
cin >> n;
arr.assign(n, 0);
dp.assign(n, vector<int> (2, 0));
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
setDp(arr, dp, n);
cout << max(dp[n-1][0], dp[n-1][1]);
}
나는 dp 배열을 한 칸 넘어서 오는 애들, 두 칸 넘어서 오는 애들로 행을 2개로 해서 2차원으로 정의했음
그렇게 한 다음 한 칸 넘어서 오는 애들은 전 칸에서 두 칸 넘어 온 애들 밖에 못 들어 오니까 그렇게 주고, 두 칸은 누구든지 올 수 있으니까 두 값 중 맥스로 넘어서 오는 식으로
최종적으로는 둘 중 더 큰 값을 출력하는 것으로 마무리
근데 이걸 그냥 1차원으로 할 수도 있더라… 다른 사람들 코드 보니까
두 칸 넘어오는 건 똑같은데, 한 칸 올 때 결국 세 칸 뒤 -> 한 칸 뒤 -> 지금 내 칸 이 테크로 넘어온 애들이 와야되는 거잖음?
그니까 그걸 그냥 수동으로 계산해준 다음에 두 칸이랑 max 해서 더 큰 거 넣어주는 식으로 하면 1차원으로도 표현 가능…
아무래도 dp는 메모리를 많이 먹으니까 이렇게 공간 복잡도 줄일 수 있는 방법 알아두면 나중에 좋을 것 같아서 적어둠.
코드로 쓰자면 이럼
dp[i] = max(dp[i-2] + arr[i], dp[i-3] + dp[i-1] + arr[i]);