BOJ/๐Ÿฅ‡

โ˜…DP Upper-Advanced I - 8 Solvedโ˜…

metamong 2024. 1. 5.

โ˜… 12015 ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2 โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))

#binary search
def binary_search(l, x):
    start,end=0,len(l)-1
    while start<=end:
        mid=(start+end)//2
        if x <= l[mid]:
            end=mid-1
            ans=mid
        else:
            start=mid+1
    l[ans]=x
    return l

#LIS
ans=[A[0]]

for x in range(1,N):
    if ans[-1] < A[x]: #just add
        ans.append(A[x])
    else: #searching the spot
        ans=binary_search(ans, A[x])

print(len(ans))

 

๐Ÿœ LIS(O(nlogn)) ๋ฌธ์ œ


โ˜… 12738 ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 3 โ˜…

 

๐Ÿœ ์ˆ˜์—ด ์›์†Œ๊ฐ€ ์Œ์ˆ˜์—ฌ๋„ LIS(O(nlogn)) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์„ฑ๋ฆฝ


โ˜… 1365 ๊ผฌ์ธ ์ „๊นƒ์ค„ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
n=list(map(int,input().split()))

def binary_search(l,x):
    start,end=0,len(l)-1
    while start<=end:
        mid=(start+end)//2
        if x <= l[mid]:
            ans = mid
            end = mid - 1
        else:
            start = mid + 1
    l[ans] = x
    return l

#lis(o(nlogn))
ans=[n[0]]

for x in range(1,N):
    if ans[-1] < n[x]:
        ans.append(n[x])
    else:
        ans=binary_search(ans,n[x])

print(N-len(ans))

 

๐Ÿœ ๊ผฌ์ด์ง€ ์•Š๊ฒŒ lis(O(nlogn)) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ


โ˜… 2352 ๋ฐ˜๋„์ฒด ์„ค๊ณ„ โ˜…

import sys
input=sys.stdin.readline
n=int(input())
l = list(map(int,input().split()))

def binary_search_lis(arr,n):
    start,end=0,len(arr)-1
    while start<=end:
        mid=(start+end)//2
        if n <= arr[mid]:
            ans = mid
            end = mid-1
        else:
            start = mid+1
    arr[ans] = n
    return arr
arr=[l[0]]
for x in range(1,n):
    if arr[-1]<l[x]:
        arr.append(l[x])
    else:
        arr = binary_search_lis(arr,l[x])
print(len(arr))

 

๐Ÿœ ์œ„ 1365 ๊ผฌ์ธ ์ „๊นƒ์ค„๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ. ์ด๋ถ„ํƒ์ƒ‰์„ ํ™œ์šฉํ•œ O(nlogn) LIS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ํฌํŠธ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ


โ˜… 3066 ๋ธŒ๋ฆฌ์ง• ์‹œ๊ทธ๋„ โ˜…

import sys
input=sys.stdin.readline

def binary_search_lis(arr,n):
    start,end=0,len(arr)-1
    while start<=end:
        mid=(start+end)//2
        if n <= arr[mid]:
            ans = mid
            end = mid-1
        else:
            start = mid+1
    arr[ans] = n
    return arr

for _ in range(int(input())):
    N=int(input())
    l = [int(input()) for _ in range(N)]
    arr=[l[0]]
    for x in range(1,N):
        if arr[-1]<l[x]:
            arr.append(l[x])
        else:
            arr = binary_search_lis(arr,l[x])
    print(len(arr))

 

๐Ÿœ ์—ญ์‹œ LIS(O(nlogn))์œผ๋กœ ์œ„ ๋ฌธ์ œ์™€ ๋™์ผ


โ˜… 1818 ์ฑ…์ •๋ฆฌ โ˜…

import sys
input=sys.stdin.readline

def binary_search_lis(arr,n):
    start,end=0,len(arr)-1
    while start<=end:
        mid=(start+end)//2
        if n < arr[mid]:
            ans = mid
            end = mid-1
        else:
            start = mid+1
    arr[ans] = n
    return arr

N=int(input())
l=list(map(int,input().split()))
arr=[l[0]]
for x in range(1,N):
    if arr[-1]<l[x]:
        arr.append(l[x])
    else:
        arr = binary_search_lis(arr,l[x])
print(N-len(arr))

 

๐Ÿœ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ฑ…์„ ๊ฐ€์ง€๋Ÿฐํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ฐ€์ง€๋Ÿฐํ•˜๊ฒŒ ์ •๋ฆฌํ•œ, ์ฆ‰ ์ฑ… ๋ฒˆํ˜ธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด LIS์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๊ณ (์ด ๋•Œ ์ฑ…์ด ๋„์—„๋„์—„ ์žˆ์–ด๋„ ์ƒ๊ด€ ์—†๋‹ค), ์ „์ฒด ์ฑ…์˜ ์ˆ˜์—์„œ LIS์˜ ๊ธธ์ด๋ฅผ ๋บ€ ๊ฐœ์ˆ˜๋งŒํผ ๋ณธ๋ž˜ ์ž๋ฆฌ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. LIS๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ์œ ํ˜•. LIS ์‘์šฉ๋ฒ„์ „


โ˜… 3745 ์˜ค๋ฆ„์„ธ โ˜…

import sys
input=sys.stdin.readline

def binary_search_lis(arr,n):
    start,end=0,len(arr)-1
    while start<=end:
        mid=(start+end)//2
        if n <= arr[mid]:
            ans = mid
            end = mid-1
        else:
            start = mid+1
    arr[ans] = n
    return arr


while 1:
    try:
        N=int(input())
        l=list(map(int,input().split()))
        arr=[l[0]]
        for x in range(1,N):
            if arr[-1]<l[x]:
                arr.append(l[x])
            else:
                arr = binary_search_lis(arr,l[x])
        print(len(arr))
    except:
        break

 

๐Ÿœ LIS(Onlogn) ๋ฌธ์ œ


โ˜… 12014 ์ฃผ์‹ โ˜…

import sys
input=sys.stdin.readline

def binary_search_lis(ar,n):
    start,end=0,len(ar)-1
    while start<=end:
        mid=(start+end)//2
        if n <= ar[mid]:
            ans = mid
            end = mid-1
        else:
            start = mid+1
    ar[ans] = n
    return ar

T=int(input())
for i in range(T):
    N,K=map(int,input().split())
    l=list(map(int,input().split()))
    arr=[l[0]]
    for x in range(1,N):
        if arr[-1]<l[x]:
            arr.append(l[x])
        else:
            arr = binary_search_lis(arr,l[x])
    if len(arr)>=K:
        print(f'Case #{i+1}')
        print(1)
    else:
        print(f'Case #{i+1}')
        print(0)

 

๐Ÿœ LIS(Onlogn) ๋ฌธ์ œ


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€