728x90
반응형
https://www.acmicpc.net/problem/2229
2229번: 조 짜기
알고스팟 캠프에 N(1 ≤ N ≤ 1,000)명의 학생들이 참여하였다. 학생들은 열심히 공부를 하고 있었는데, 어느 날 조별 수업을 진행하기로 하였다. 조별 수업의 목적은 잘 하는 학생들과 덜 잘 하는
www.acmicpc.net
문제 해결
사실 딱히 좋은 아이디어가 생각이 안났다.
DP를 이용해 풀어야 겠다는 생각을 했는데 사실 시간복잡도가 커서 마음이 안들었다.
import sys
input = sys.stdin.readline
INF = sys.maxsize
n = int(input())
A = list(map(int, input().split())) # value: 점수 index: 나이
dp = [0]*(10000)
if n ==1:
print(0)
exit()
dp[1] = abs(A[1]-A[0])
dp[2] = max(dp[0]+abs(A[2]-A[1]),dp[1])
for i in range(3,n):
for j in range(1,i+1):
dp[i] = max(dp[i-j]+max(A[i-j+1:i+1])-min(A[i-j+1:i+1]),dp[i])
print(max(dp))
for문 두개에, max, min 까지... 시간복잡도는 상당했다.
최적화의 답을 검색해서 알아봤다.
최적화
import sys
input = sys.stdin.readline
INF = sys.maxsize
n = int(input())
A = list(map(int, input().split())) # value: 점수 index: 나이
dp = [0]*(10000)
for i in range(n):
dp[i+1] = dp[i] # dp[i+1]을 A[i]까지 원소로 이루이전 최고 점수합을 이야기한다.
minval = maxval = A[i]
j = i-1
while j>=0 and (A[j]<minval or A[j]>maxval):
minval, maxval = min(A[j], minval), max(A[j], maxval)
dp[i+1] = max(dp[i+1], dp[j]+maxval-minval)
j -= 1
print(dp[n])
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1788 피보나치 수의 확장 (0) | 2023.04.17 |
---|---|
[python] 백준 2240 자두나무 (0) | 2023.04.17 |
[python] 백준 15486 퇴사2 (0) | 2023.04.16 |
[python] 백준 1508 레이스 (0) | 2023.04.16 |
[python] 백준 1371 가장 많은 글자 (0) | 2023.04.14 |
댓글