https://github.com/Dev-Guccin
Guccin
https://github.com/Dev-Guccin
전체 방문자
오늘
어제
  • 분류 전체보기 (172)
    • 알고리즘 (140)
    • 삽질방지 (13)
    • SystemHacking (1)
    • 일상 (4)
    • 개발 (8)
    • 스프링 부트 REST API 개발일지 (5)
    • JPA (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • heapq
  • DFS
  • 다익스트라
  • 이분탐색
  • counter
  • 그리디
  • 다이나믹프로그래밍
  • 유니온 파인드
  • MST
  • 파이썬
  • 이분 탐색
  • 최단경로
  • 그래프
  • LIS
  • Python
  • 백준
  • 스택
  • 최소힙
  • 프로그래머스
  • 유클리드호제법
  • DP
  • 다이나믹 프로그래밍
  • 재귀함수
  • 백트래킹
  • python3
  • 큐
  • 재귀
  • BFS
  • 12015
  • 최대공약수

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
https://github.com/Dev-Guccin

Guccin

알고리즘

백준 1912 풀이 (연속합, 다이나믹 프로그래밍)

2021. 2. 26. 14:17

이거 진짜 쉬운줄 알았는데 DP로 풀어야해서 헤맸던 문제이다.

처음에는 값을 누적시켜서 DP느낌으로 풀었는데 시간 복잡도가 n제곱이라 자꾸 시간초과가 났다.

그래서 내가 푼 방식이 잘못되었다는 것을 깨닫고 한참을 헤매었다.

n = int(input())
nl = list(map(int, input().split()))
dp = [0 for i in range(n)]
big = -1000
for size in range(n):
    for i in range(n-size):
        dp[i] += nl[i+size]
    tmp = max(dp)
    if tmp > big:
        big = tmp
    print(dp)
print(big)

 

그래서 고친게 다음과 같다.

n = int(input())
nl = list(map(int, input().split()))
sum = [nl[0]]
for i in range(n-1):
    sum.append(max(sum[i]+nl[i+1], nl[i+1]))
print(max(sum))

이렇게 풀기위해서는 sum을 잘 정의해야한다.

sum의 역할은 인덱스에 해당하는 값을 포함할때 최댓값을 구해야하는 것이다. 따라서 이전의 최댓값+현재값 vs 현재값을 비교하여 값이 줄어드는지 늘어나는지를 판단하여 큰 값(현재값을 포함할때 큰값)을 새롭게 sum에 갱신해주면된다.

이러한 방식으로 풀게되면 시간복잡도가 n으로 줄어들고 아주 빠르게 연산이 가능해진다.

'알고리즘' 카테고리의 다른 글

백준 1931 풀이 (회의실 배정, 그리디)  (0) 2021.02.26
백준 11047 풀이 (동전 0, 그리디)  (0) 2021.02.26
백준 9251 풀이 (LCS, 다이나믹 프로그래밍)  (0) 2021.02.25
백준 2565 풀이 (전깃줄, 다이나믹 프로그래밍, LIS)  (0) 2021.02.25
백준 11054 풀이 (가장 긴 바이토닉 부분 수열, 다이나믹 프로그래밍)  (0) 2021.02.24
    '알고리즘' 카테고리의 다른 글
    • 백준 1931 풀이 (회의실 배정, 그리디)
    • 백준 11047 풀이 (동전 0, 그리디)
    • 백준 9251 풀이 (LCS, 다이나믹 프로그래밍)
    • 백준 2565 풀이 (전깃줄, 다이나믹 프로그래밍, LIS)
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin

    티스토리툴바