일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 저지시스템구축
- oj
- 역량테스트
- 온라인 저지 구축
- SW역량테스트
- 구축
- a형
- SWIFT
- xcode
- 모의 SW 역량테스트
- 비트마스킹
- 역테
- hustoj
- 소스코드
- 백준
- 삼성
- 모의 SW역량테스트
- 알고리즘
- BOJ
- SWEA
- c++
- oj구축
- STL
- 온라인저지시스템구축
- IOS
- 풀이
- 삼성기출
- 7576
- SW Expert Academy
- 개발
Archives
- Today
- Total
꾸르꾸르
[BOJ] 2579번 계단오르기 풀이(C++) 본문
2017.10.25에 쓰여진 글입니다.
문제링크
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 <그림 2>와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩
www.acmicpc.net
풀이방법
뭐 딱히 풀이방법이라고 하면..
dp의 풀이는 역시나 점화식을 이쁘게 세워보는것.. 뒤부터 생각해보는 것 정도...
코드와 주석을 보고 열심히 이해하시면 될듯!
소스코드
#include <iostream>
#include <algorithm>
using namespace std;
int N; //계단의 개수
int s[301]; //계단의 각 점수 저장
int main()
{
int dp[301] = { 0 };
//dp[0] = 0번째계단에서의 최대점수
//dp[1] = 1번째계단에서의 최대점수
//...
//dp[N] = N번째 계단에서의 최대점수
cin >> N; //계단의 개수 입력받기
for (int i = 1; i <= N; i++)
cin >> s[i];
dp[0] = 0; //초기 바닥일때 0 넣어줌
dp[1] = s[1]; //한칸 올라옴 (첫번째 계단의 점수)
dp[2] = max(s[1] + s[2], s[2]); //두번째 계단올라오는법 -> 더큰거(계단2개밟고올라오기,한번에 2번째계단으로 점프)
for (int i = 3; i <= N; i++)
dp[i] = s[i] + max(s[i - 1] + dp[i - 3], dp[i - 2]);
//현재 계단의 점수 + 큰거(3칸전->1칸전->현재, 2칸전에서 한번에 뜀)
//만약 현재자리한칸전의 계단에서 뛸려면 무조건 3칸전->1칸전->현재 의 순으로 뛰어야만 한다.
//3칸전 1칸전 현재 -> 연달아 3번을 밟을수없기때문에 3칸전까지 뛸수있는 최대값 + 1칸전 계단점수+현재계단점수
//2칸전에서는 무조건 한번에 뛰어야한다. (위에 1칸전 상황과 중복방지)
cout << dp[N] << endl; //N번째 계단에서 최대값을 저장한다.
return 0;
}
'코딩, 알고리즘, 문제풀이 > BOJ 백준' 카테고리의 다른 글
[BOJ] 7569번 토마토 문제풀이 (C++) (0) | 2019.05.24 |
---|---|
[BOJ] 7576번 토마토 문제풀이 (C++) (0) | 2019.05.22 |
[BOJ] 1931번 회의실배정 풀이(C++) (0) | 2019.05.19 |
[BOJ] 3190번 뱀 문제풀이 (C++) (0) | 2019.05.18 |
[BOJ] 14503번 로봇 청소기 문제풀이 (C++) (0) | 2019.05.17 |