일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 블로그개설
- ADAS
- 백트래킹
- python3
- Kotlin
- 스프링프레임워크
- BFS
- 연결리스트
- 백준
- 스프링
- c++
- c
- vue.js
- Map
- 프로그래머스
- Android
- Rebase
- git
- TensorFlow
- 안드로이드
- 머신러닝
- 프로그래밍
- hackerrank
- spring
- 카카오인코더
- DP
- 스프링 프레임워크
- 인코더
- retrofit
- stl
Archives
- Today
- Total
이것저것 공부한 기록
C++) 백준 2156번 풀이_포도주 시식 본문
https://www.acmicpc.net/problem/2156
술 문제가 나와서 정말 기뻤는데
후... 효주친구... 술 많이 먹여주고 싶었지만 네 번이나 실패했다.
아니 6잔이 놓여있으면~~ 다 먹으면 되지~~ 이걸 3잔연속 마실 수 없다는게 실화냐~~
무튼 틀렸을 때는 한 단계 더 생각해보자는 걸 알게된 문제...
2차원 배열을 만들어서,
이전 잔 바로 먹을 경우/ 1잔 뛰어넘고 먹을 경우
로 DP계산을 한 것 까진 좋았는데
분명 손으로 풀어봤을땐 다 맞았는데 계속 틀렸다는거다
그래서 찾아보니
무려
2잔을 뛰어넘고 마시는 경우의 수도 고려해야했다.
이전 스티커 문제와 마찬가지로
3잔 뛰어넘을경우 어짜피 중간에 한 잔을 마시는게 이득이기 때문에 그 경우는 고려하지 않는게 포인트.
그래서 뭐... 결국
이전 잔 바로 먹을 경우 / 3잔연속을 방지하기위해 몇 잔이든 뛰어넘고 먹을 경우
로 나눠서 DP계산을 하면 된다.
지금 집에 가고싶어서 조금 급하게 코드를 짜면 (더럽게) 됩니다.
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(void) {
int i, j, cnt, inp ;
long long int alchohol[2][1001] = { 0 };
scanf("%d", &cnt);
scanf("%d", &inp);
alchohol[0][1] = alchohol[1][1] = inp;
scanf("%d", &inp);
alchohol[0][2] = alchohol[1][1] + inp;
alchohol[1][2] = inp ;
for (i = 3; i <= cnt; ++i)
{
scanf("%d", &inp);
alchohol[0][i] = alchohol[1][i - 1] + inp;
alchohol[1][i] = max(max(alchohol[0][i - 2], alchohol[1][i - 2]), max(alchohol[0][i-3], alchohol[1][i-3])) + inp;
}
printf("%lld", max(max(alchohol[0][cnt], alchohol[1][cnt]), max(alchohol[0][cnt - 1], alchohol[1][cnt - 1])));
}
'Study > 프로그래밍 문제풀이' 카테고리의 다른 글
C++) 백준 2133번 풀이_타일 채우기 (0) | 2019.10.23 |
---|---|
C++) 백준 1699번 풀이_제곱수의 합 (0) | 2019.10.23 |
C++) 백준 9465번 풀이_스티커 (0) | 2019.10.20 |
C++) 백준 10844번 풀이_쉬운 계단 수 (0) | 2019.10.18 |
C++) 백준 2579번 풀이_계단 오르기 (0) | 2019.10.18 |