본문 바로가기
카테고리 없음

🐨BOJ# 11053]가장 긴 증가하는 부분 수열

by redcubes 2024. 5. 12.
import sys

def input():return sys.stdin.readline().rstrip()

def lis(arr):
    n = len(arr)
    dp = arr[:]  # 각 원소를 포함하는 부분 수열의 합의 초기값은 자기 자신으로 시작
    for i in range(1, n):
        for j in range(i):
            if arr[i] > arr[j]:  # arr[i]가 arr[j]보다 클 경우
                dp[i] = max(dp[i], dp[j] + arr[i])  # 최대 합을 업데이트
    return max(dp)

n = int(input())
a = list(map(int, input().split()))
print(lis(a))
import sys
input = sys.stdin.read
from bisect import bisect_left

def find_lis_length(sequence):
    if not sequence:
        return 0
    
    # LIS를 위한 최소 마지막 값들을 저장하는 배열
    lis_ends = []
    
    for value in sequence:
        # 현재 값이 lis_ends 배열의 어느 위치에 들어갈지 결정
        pos = bisect_left(lis_ends, value)
        
        # 만약 현재 값이 모든 마지막 값보다 크면 새로운 길이의 LIS 생성
        if pos == len(lis_ends):
            lis_ends.append(value)
        # 아니라면 기존 위치를 현재 값으로 업데이트 (더 작은 값으로)
        else:
            lis_ends[pos] = value
    
    # LIS의 최대 길이 반환
    return len(lis_ends)

# 입력 처리
data = input().split()
n = int(data[0])
sequence = list(map(int, data[1:]))

# LIS 길이 계산 및 출력
print(find_lis_length(sequence))

https://www.acmicpc.net/problem/11053