문제출처 : https://www.acmicpc.net/problem/2579


1. 문제요약

- 계단을 하나 건너 뛸 수 있음

- 최대 2번 연속으로만 밟을 수 있음

- 마지막 계단은 무조건 밟아야 함


- 1, 2, 4, 5 순으로 밟는건 가능

- 1, 2, 3, 4 순으로 밟는건 불가능 / 1, 2, 3 이 연속으로 3번 밟았기 때문


- 최대 합은?


2. 접근방법

- 방법 1.

  d[n] : n번째 계단에서 최대합

  현재 계단을 밟는 경우는 전전 계단을 밟고 한칸 뛰어서 현재 계단을 밟는 경우

                                  전 계단을 밟고 바로 연속으로 현재 계단을 밟는 경우

  하지만 전계단을 밟고 현재 계단을 밟는다면 현재를 n이라 했을 때, n-1번째 계단을 밟고 온 경우가

  n-1에서 두번 연속으로 밟은 경우인지 알 수 없음.

  그래서 n-3에서 최대합에서 n-2를 건너뛰고 n-1과 n 값을 합하면 됨


  d[n] = max(d[n-2] , d[n-3] + a[n-2]) + a[n]


- 방법 2.

  포도주 시식과 비슷한 방법으로

  d[3] : d[0] - 현재 계단을 밟지 않았을 때 최대합

          d[1] - 현재 계단이 연속 1회 일때 최대합

          d[2] - 현재 계단이 연속 2회 일때 최대합

  d[0] = max(d[1], d[2])

  d[1] = d[0] + a

  d[2] = d[1] + a


3. 시간복잡도

- 방법 1, 2 모두 n


4. 회고

- 포도주 시식 boj 2156 과 같은 문제



소스코드 방법 2



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 9461 파도반 수열  (0) 2018.01.24
BOJ 1966 제곱수의 합  (0) 2018.01.23
BOJ 1912 연속합  (0) 2018.01.21
BOJ 11054 가장 긴 바이토닉 부분 수열  (0) 2018.01.20
BOJ 11722 가장 긴 감소하는 부분 수열  (0) 2018.01.20

문제출처 : https://www.acmicpc.net/problem/1912


1. 문제요약

- n개로 이루어진 임의의 수열 중 연속되는 숫자 합의 최대값은?

- A = {10, -4, 3, 1, 5, 6, -35, 12, 21, -1}

  A = {10, -4, 3, 1, 5, 6, -35, 12, 21, -1} 12 + 21 연속합이 33으로 최대

- 1 <= n <= 100,000

  -1,000 <= Ai <= 1,000


2. 접근방법

- 연속합이 최대

- 어느지점에서 새로운 연속이 생길까?

- 이전 까지의 합 보다 현재의 값이 더 크면 새로운 연속의 시작

- d[i] = max(d[i], d[i-1] + a[i])


10 

-4 

-35 

12 

21 

-1 

10 


10 

-4 

-35 

12 

21 

-1 

10 

6 


10 

-4 

-35 

12 

21 

-1 

10 

9 


10 

-4 

-35 

12 

21 

-1 

10 

10 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 

21 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 

21 

-14 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 

21 

-14 

12 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 

21 

-14 

12 

33 


10 

-4 

-35 

12 

21 

-1 

10 

10 

15 

21 

-14 

12 

33 

32 


3. 시간복잡도

- n


4. 회고

- 값의 범위가 -1000 <= Ai <= 1000 으로 음수가 됨을 망각함.


- 첫번째 실수, d의 값을 0으로 시작함..

  첫번째 입력값이 음수이면 d는 음수가 아니라 0으로 시작하게 됨


- 두번째 실수, ans의 값을 0으로 초기화함...

  집합의 모든 수가 음수 이면 정답은 0이 되어버림



소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

문제출처 : https://www.acmicpc.net/problem/11054


1. 문제요약

- 수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... Sn-1 > Sn 을 만족한다면, 그 수열을 바이토닉 수열

- A = {1, 5, 2, 1, 4, 3, 4, 5, 2, 1}

  A = {1, 5, 2, 1, 4, 3, 4, 5, 2, 1} 가장 긴 바이토닉 수열의 길이는 7


2. 접근방법

- 좌측 LIS / 우측 LIS


3. 시간복잡도

- 2n^2 + n


4. 회고



소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

+ Recent posts