일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구간 합 구하기 4
- 10162
- 프로그래머스
- 위클리 챌린지
- codeSyntaxHighlight
- 다이내믹 프로그래밍
- 주식 가격
- 브루트포스 알고리즘
- 정수 삼각형
- 2018 KAKAO BLIND RECRUITMENT
- mermaid js
- 1620
- Hasing
- js
- 이분탐색
- 숫자 문자열과 영단어
- C++
- n^2 배열 자르기
- 18111
- javascript
- react
- 없는 숫자 더하기
- 5525
- 소수 체크
- colorSyntax
- Git Convention
- 4796
- BOJ
- 옵셔널 체이닝 연산자
- 깊이 우선 탐색
Archives
- Today
- Total
개발하는 kim-hasa
[c++][BOJ][2579] 계단 오르기 본문
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
각 계단에 가중치가 있고 , 꼭대기에 갔을 때 가장 큰 점수를 얻는 경우를 구하는 문제입니다.
일반 다이내믹 프로그래밍으로 풀려고 했으나 , 연속된 3개의 계단을 밟지 못하는 경우가 있습니다.
그래서 생각한게
1. 3번째 전 칸을 밟고 연속 2개의 계단을 밟는 경우 ,
2. 2번째 전 칸을 밟고 한칸 띄어서 이번 계단을 밟는 경우
두 경우를 비교하려고 합니다. 이 과정에서 기본 계단의 가중치는 그대로여야 하기 때문에 , 벡터를 두개 사용하도록 하겠습니다.
2번째 전 까지 온 최대값 + 현재 칸의 점수 vs 3번째 전까지 최대값 + 이전칸 + 이번 칸
이렇게 비교해서 최대값을 리턴합니다.
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> arr(n+1 , 0);
vector<int> stair(n+1 , 0);
for(int i=1; i<=n; i++){
cin >> arr[i];
}
stair[1] = arr[1];
stair[2] = arr[1] + arr[2];
stair[3] = max(arr[1] + arr[3] , arr[2] + arr[3]);
for(int i=4; i<=n; i++){
stair[i] = max(stair[i-2] + arr[i], stair[i-3] + arr[i-1] + arr[i]);
}
cout << stair[n];
}
'Algorithm > BOJ' 카테고리의 다른 글
[c++][BOJ][1541] 잃어버린 괄호 (0) | 2022.03.01 |
---|---|
[c++][BOJ][2606] 바이러스 (0) | 2022.03.01 |
[c++][BOJ][18111] 마인크래프트 (0) | 2022.03.01 |
[c++][BOJ][1463] 1로 만들기 (0) | 2022.03.01 |
[c++][BOJ][1074] Z (0) | 2022.02.28 |