[백준] 2670 연속부분 최대 곱

문제


N개의 실수가 있을 때 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아 출력해라.

입력 및 출력


첫 번째 줄: 나열될 양의 실수들의 개수 N 두 번째 줄 ~ 마지막 줄: 실수

Dynamic Programming


  • 재귀와 유사
  • 하지만 재귀를 사용하면 동일한 문제가 여러번 반복되어 비효율적
  • 동적 프로그래밍은 큰 문제를 작은 문제로 쪼개 답을 저장해두고 계속 재활용
  • 하나의 문제를 한 번만 풀도록 하는 알고리즘

DP 사용 조건

  1. Overlapping Subproblems
    • 동일한 문제들이 반복되어야 함
  2. Optimal Substructure
    • 부분 문제의 최적 결과 값을 사용해 전채 문제의 최적 결과를 낼 수 있어야 함

구현 방식

  1. Bottom-up
    • 작은 문제부터 구해가는 방식
  2. Top-down
    • 큰 문제를 풀 때 작은 문제가 아직 해결되지 않은 상태라면 작은 문제를 먼저 해결하는 방식

코드

해결 방식

  1. arr[i] 값 dp[i-1]*arr[i] 값 비교
    • dp[i-1]은 arr[i]이전의 수들의 곱이 최대가 되는 부분

if) arr[i] < dp[i-1] * arr[i]

  • arr[i] = dp[i-1] * arr[i]

else if) arr[i] > dp[i-1] * arr[i]

  • 변경 x

homebdy
homebdy 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람.
comments powered by Disqus