https://www.acmicpc.net/problem/11055
11055번: 가장 큰 증가하는 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는
www.acmicpc.net
11053번 가장 긴 증가하는 부분 수열의 응용문제이다.
나는 바로 합계를 구하면 뭔가 꼬여서 답이 안나올줄 알고
일부러 dp를 2차원으로 숫자 [순서, 합]으로 2차원으로 만들었는데 꼭 그럴필요는 없다는 점...
import sys
n = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))
dp = [[1,0] for _ in range(n)]
dp[0][1] = num[0]
m = 0
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp[i][0] = max(dp[i][0], dp[j][0]+1)
dp[i][1] = max(dp[i][1], dp[j][1] + num[i])
m = max(m, dp[i][1])
print(m)
이렇게 하니 틀렸다고 뜨는데 num[j]가 num[i]보다 다 큰 경우가 발생할 수도 있기 때문에
else에 따로 num[i]의 값을 dp[i][1]에 넣어주어야 한다
import sys
n = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))
dp = [[1,0] for _ in range(n)]
dp[0][1] = num[0]
m = 0
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp[i][0] = max(dp[i][0], dp[j][0]+1)
dp[i][1] = max(dp[i][1], dp[j][1] + num[i])
else:
dp[i][1] = max(dp[i][1], num[i])
m = max(m, dp[i][1])
print(m)
다른 분들은 dp를 2차원이 아니라 1차원으로 바로 합을 넣어 진행하셨다
메모리사용량은 동일하지만 시간은 확실히 더 빠르다
import sys
n = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))
dp = [0] * n
dp[0] = num[0]
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp[i] = max(dp[i], dp[j]+num[i])
else:
dp[i] = max(dp[i], num[i])
print(max(dp))
'공부 > 알고리즘' 카테고리의 다른 글
[알고리즘][백준] 11722번 가장 긴 감소하는 부분 수열 - 파이썬(python) 풀이 (0) | 2024.04.02 |
---|---|
[알고리즘][백준] 1932번 정수 삼각형 - 파이썬(python) 풀이 (1) | 2024.03.25 |
[알고리즘][백준] 9465번 스티커 - 파이썬(python) 풀이 (0) | 2024.03.19 |
[알고리즘][백준] 11057번 오르막 수 - 파이썬(python) 풀이 (1) | 2024.03.18 |
[알고리즘][백준] 1309번 동물원 - 파이썬(python) 풀이 (0) | 2024.03.16 |