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]);
}
'PS' 카테고리의 다른 글
BOJ - 1463. 1로 만들기 (C++) (0) | 2024.08.04 |
---|---|
BOJ - 1929. 소수 구하기 (C++) (0) | 2024.06.02 |
SWEA - 1926. 간단한 369게임 (C++) (0) | 2024.04.27 |
BOJ - 10814. 나이순 정렬 (C++) (0) | 2024.04.19 |
완전탐색 연습문제 (C++) (0) | 2024.03.30 |