PS
BOJ - 2579. 계단 오르기 (C++)
kugnuoy
2024. 8. 4. 18:54
2579. DP
https://www.acmicpc.net/problem/2579
[풀이]
점화식을 1차원 배열로 만들면 연속해서 계단을 밟는 조건을 표현하기 어려워 2차원 배열 d로 선언한다.
또한 각 계단의 점수를 s 배열에 저장해둔다.
d[k][1]은 연속적으로 계단을 밟지 않고 올라와서 k번째 계단에 올라왔을 때 점수의 최댓값을 의미하고
d[k][2]는 직전 계단을 밟아 두 번째 계단이며 k번째 계단일 때 점수의 최댓값을 의미한다.
따라서 d[k][1]일때는 반드시 k-2번째 계단을 밟았을 것으므로 max( d[k-2][1], d[k-2][2] ) + s[k] 가 되고
d[k][2]일때는 반드시 직전 계단인 k-1번째 계단을 밟았을 것이므로 d[k-1][1] + s[k] 가 된다.
#include "bits/stdc++.h"
using namespace std;
int d[1000001][3];
int s[1000001];
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int T; cin >> T;
for (int i=1; i<=T; i++) cin >> s[i];
d[1][1] = s[1];
d[2][1] = s[2];
d[2][2] = s[1] + s[2];
for (int i=3; i<=T; i++){
d[i][1] = max(d[i-2][1], d[i-2][2]) + s[i];
d[i][2] = d[i-1][1] + s[i];
}
cout << max(d[T][1], d[T][2]);
}