티스토리 뷰
# 출처 : https://www.acmicpc.net/problem/2579
이전 칸에서 현재 칸에 도달한 경우를 나눠 계산해 주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int N; // 각 칸에 할당된 점수 vector<int> stairVal; // 현재까지 오는데 계산된 총 점수 // 0 : 이전 칸에서 2칸 건너 현재 칸에 도달 // 1 : 이전 칸에서 1칸 건너 현재 칸에 도달 int stackedVal[300][2]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; for (int i = 0; i < N; ++i) { int num; cin >> num; stairVal.push_back(num); } // 초기값 셋팅 stackedVal[0][0] = stairVal[0]; stackedVal[1][0] = stairVal[1]; stackedVal[1][1] = stairVal[0] + stairVal[1]; for (int i = 2; i < N; ++i) { // 2칸 건너 현재에 온 경우 // 이 경우 이전 칸에서의 두 경우 모두 가능 stackedVal[i][0] = max({ stackedVal[i][0], stackedVal[i - 2][0] + stairVal[i], stackedVal[i - 2][1] + stairVal[i] }); // 1칸 건너 현재에 온 경우 // 이 경우 이전 칸에서 2칸 건너 그 칸에 온 경우만 가능 // 즉, 연달아 세 칸을 밟을 수 없음 stackedVal[i][1] = max({ stackedVal[i][1], stackedVal[i - 1][0] + stairVal[i] }); } cout << (stackedVal[N - 1][0] > stackedVal[N - 1][1] ? stackedVal[N - 1][0] : stackedVal[N - 1][1]) << '\n'; return 0; } | cs |
'ALGORITHM' 카테고리의 다른 글
백준 / 2193번 / 이친수 / C++ (0) | 2019.01.29 |
---|---|
백준 / 11726번 / 2×n 타일링 / C++ (0) | 2019.01.29 |
백준 / 1920번 / 수 찾기 / C++ (0) | 2019.01.28 |
백준 / 4963번 / 섬의 개수 / C++ (0) | 2019.01.28 |
백준 / 1003번 / 피보나치 함수 / C++ (0) | 2019.01.28 |
댓글