Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 순열
- 크루스칼
- 그리디
- 조합
- 비트마스크
- 우선순위 큐
- 스택
- 클래스
- DP
- 피보나치 수
- 완전 탐색
- 세그먼트 트리
- dfs
- 링크드리스트
- Knapsack
- 백트래킹
- 시뮬레이션
- 재귀
- 빠른 입출력
- 분할 정복
- BeautifulSoup
- SSAFY
- MST
- 중복 순열
- 이분 탐색
- 메모리풀
- BFS
- 문자열
- 큐
- lis
Archives
- Today
- Total
작심 24/7
[백준] 2579번 계단 오르기 본문
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
조건을 요약해보면
1. 1칸, 2칸만 이동할 수 있다.
2. 연속해서 1칸을 두 번 가는 것은 불가능하다.
3. N번째 칸은 무조건 밟아야 한다.
즉, i번째 칸에 있는 상태는
1칸 전을 밟고 온 상태 거나 2칸 전을 밟고 온 상태, 총 두 가지 경우가 나온다.
전자를 stair[0][i], 후자를 stair[1][i]라고 표현을 해본다면
stair[0][i]의 1칸 전은 stair[0][i-1]과 stair[1][i-1]이다.
그러나 1칸을 연속해서 이동할 수 없으므로 stair[0][i-1]은 제외시켜준다.
그렇게 되면 stair[0][i] = 현재 계단의 점수 + stair[1][i-1]이 된다.
stair[1][i]의 2칸 전은 stair[0][i-2]과 stair[1][i-2]이다.
이 때는 제약 조건이 없으므로 이 둘 중 최댓값으로 계산하면 된다.
그렇게 되면 stair[0][i] = 현재 계단의 점수 + 최댓값(stair[0][i-2], stair[1][i-2])이 된다.
문제에 있는 예제를 표로 정리해보면 이렇게 나타낼 수 있다.
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 10 | 20 + 10 = 30 | 15 + 20 = 35 | 25 + 25 = 50 | 10 + 55 = 65 | 20 + 45 = 65 |
1 | 10 | 20 + 최댓값(0,0) = 20 |
15 + 최댓값(10,10) = 25 |
25 + 최댓값(30,20) = 55 |
10 + 최댓값(35,25) = 45 |
20 + 최댓값(50,55) = 75 |
이대로 구현해주면 끝
#include <iostream>
#include <algorithm>
using namespace std;
long long stair[2][301] = { 0 };
int main() {
int N;
cin >> N >> stair[0][0];
stair[1][0] = stair[0][0];
int temp;
for (int i = 1; i < N; i++) {
cin >> temp;
stair[0][i] = temp + stair[1][i - 1];
stair[1][i] = temp + max(stair[0][i - 2], stair[1][i - 2]);
}
cout << max(stair[0][N - 1], stair[1][N - 1]);
return 0;
}
'백준' 카테고리의 다른 글
[백준] 10844번 쉬운 계단 수 (0) | 2020.05.29 |
---|---|
[백준] 1463번 1로 만들기 (C++, JAVA) (0) | 2020.05.28 |
[백준] 1932번 정수 삼각형 (0) | 2020.05.27 |
[백준] 1149번 RGB거리 (0) | 2020.05.27 |
[백준] 1003번 피보나치 함수 (0) | 2020.05.26 |
Comments