Notice
Recent Posts
Recent Comments
Link
꾸준하게 거북이처럼
백준 11055번 파이썬 본문
11055번: 가장 큰 증가 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수
www.acmicpc.net
풀이
현재의 값보다 작은 수들 중 가장 dp 값이 큰 것을 더하여 dp값을 업데이트 하고 max(dp)를 구한다.
코드
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(1, n):
big = 0
for j in range(i):
if arr[j] < arr[i] and big < dp[j]:
big = dp[j]
dp[i] += big + arr[i]
print(max(dp))
여기서 더 시간적 효율성을 높일 수 있는 다른 풀이도 있다.
풀이2
이미 정렬이 되어있다면? 엄청 쉬울 것이다. 해당 숫자 전까지 리스트 중에서 가장 큰 값을 더하면 그만이다.
이미 값의 범위는 1000이하로 정해져 있어서 배열을 이용하여 1001까지의 배열을 만들어 각각 최댓값(해당 숫자 전까지 리스트 중에서 가장 큰 값)을 구하여 dp배열에 저장한다.
코드
n = int(input())
dp = [0] * 1001
a = list(map(int, input().split()))
for i in a:
dp[i] = max(dp[:i]) + i
print(max(dp))
'Algorithm 문제 & 공부 > DP' 카테고리의 다른 글
백준 13398번 파이썬 - 연속합2 (0) | 2022.08.26 |
---|---|
백준 11054번 파이썬 - 가장 긴 바이토닉 부분 수열 (0) | 2022.08.25 |
백준 2156번 - 파이썬 (1) | 2022.08.21 |
백준 1309 파이썬 (0) | 2022.08.18 |
백준 1149번 파이썬 (0) | 2022.08.17 |
Comments