โ 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) ๋ฌธ์
โ 2655 ๊ฐ์ฅ๋์ํ์๊ธฐ โ
import sys
input=sys.stdin.readline
n = int(input())
dp = [[0, []] for _ in range(n)] #[height, [brick_nums listed]]
bricks = []
for i in range(n):
s,h,w = map(int,input().split())
bricks.append((s,h,w,i+1))
bricks_sorted = sorted(bricks,key = lambda x : x[0])
#dp initialization
for i in range(n):
cur_h, cur_num = bricks_sorted[i][1], bricks_sorted[i][3]
dp[i][0] = cur_h
dp[i][1] = [cur_num]
for i in range(1,n):
cur_num = bricks_sorted[i][3]
cur_w = bricks_sorted[i][2] #check only by w
cur_h = bricks_sorted[i][1]
for x in range(i):
last_brick_num = dp[x][-1][-1]
last_brick_weight = bricks[last_brick_num-1][2]
last_brick_height = bricks[last_brick_num-1][1]
if last_brick_weight < cur_w:
if dp[i][0] < cur_h + dp[x][0]: #dp update
dp[i][0] = cur_h + dp[x][0]
dp[i][1] = dp[x][1] + [cur_num]
dp.sort(key = lambda x: x[0])
print(len(dp[-1][-1]))
print(*dp[-1][1], sep = '\n')
๐ ์์์ ์ฃผ์ด์ง (๋ฐ๋ฉด S, ๋์ด, ๋ฌด๊ฒ, ๋ธ๋ก๋ฒํธ)์ธ ๋ธ๋ก๋ค์ ๋์ดํด๋ณด๋ฉด
25 3 4 1
4 4 6 2
9 2 3 3
16 2 5 4
1 5 2 5
(1) DP ์์ด๋์ด๋ฅผ ์ฌ์ฉ. DP์ ๊ตฌ์ฑ์ฑ๋ถ์ 2๊ฐ๋ก ๊ฐ ๋ธ๋ก์ด ๋ฌด์กฐ๊ฑด ์๋์ ๋ธ๋ก์ผ๋ก ๋ค์ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋์ height์ ๊ทธ ๋์ ๋ธ๋ก ๋ฒํธ ์กฐํฉ list(์ฆ, LIS์ dp์ ์์ ํ ๋๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค)
(2) ์ฆ DP initialization ์ํด ๋ฐ๋ฉด S ์ค๋ฆ์ฐจ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ.
1 5 2 5
4 4 6 2
9 2 3 3
16 2 5 4
25 3 4 1
(3) DP initialization. ์ผ๋จ, ๊ฐ dp ๊ตฌ์ฑ์ฑ๋ถ์ ํด๋น brick(sorted๋ brick ๊ธฐ์ค์ผ๋ก ์งํ)์ด ๋ฌด์กฐ๊ฑด ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก ํ์ฌ brick์ height / number dp๋ก update.
[[5, [5]], [4, [2]], [2, [3]], [2, [4]], [3, [1]]]
(4) LIS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก sorted๋ bricks ๊ธฐ์ค์ผ๋ก ์ด์ค for๋ฌธ(O(n^2)) ๋๋ฉด์ ํ์ฌ index i, ์ฆ dp[i]๋ฅผ ์ฑ์ด๋ค๊ณ ํ์ ๋, for x in range(i)๋ก ๋๋ฉด์ โ ์์ brick x์์์ weight๋ณด๋ค ํ์ฌ index i์์์ weight๊ฐ ๋ ํฌ๊ณ , โก ํ์ฌ dp[i]์ height๋ณด๋ค (์์ brick x์์์ dp[x]์ height(์ฆ, brick x๋ฅผ ๋ฐ๋ฐ๋ฅ์ผ๋ก ํ์ ๋์ ์ต๊ณ ๋์ด) + ํ์ฌ index i์์์ height)๊ฐ ๋ ํฌ๋ค๋ฉด, dp์ ๋ ์์ update
[[5, [5]], [9, [5, 2]], [7, [5, 3]], [9, [5, 3, 4]], [10, [5, 3, 1]]]
(5) dp์ ๊ตฌ์ฑ์์ ์ฒซ๋ฒ์งธ ์ค ์ต๋๊ฐ์์์ ๋๋ฒ์งธ ์์ brick number์ ๋๋ฒ์งธ ์์์ ๊ธธ์ด(the number of bricks) ๊ฐ๊ฐ ์ถ๋ ฅํ๋ฉด ๋!
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Backtracking Upper-Advanced I - 1 Solvedโ (0) | 2024.01.24 |
---|---|
โ Backtracking Advanced I - 3 Solvedโ (1) | 2024.01.21 |
โ Binary Search Advanced I - 2 Solvedโ (0) | 2023.12.29 |
โ Coordinate Compression Advanced - 2 Solvedโ (0) | 2023.12.28 |
โ Tree Advanced I - 1 Solvedโ (1) | 2023.12.22 |
๋๊ธ