# 14002 1699 2225 1149 1309 11057 9465 1932 11055 11722
# task
num = int(input())
seq = [int(i) for i in input().split()]
dp = [1]*num # 0부터 5까지 6개의 원소
tracker = [-1]*num
for i in range(1,num): #1부터 5까지 5개의 원소
for j in range(0,i):
if seq[j]<seq[i] and dp[j]>=dp[i]:
dp[i] = dp[j]+1
tracker[i]= j
max_value = max(dp) # 어레이에서 가장 큰 값
idx = dp.index(max_value)
print(max_value)
answer=[]
while True:
answer.append(seq[idx])
if tracker[idx]==-1:
break
else:
idx = tracker[idx]
answer.reverse()
print(' '.join(str(i) for i in answer))
# 1699
# 입력
num = int(input())
if num<=3:
print(num)
exit()
# 초기값 설정
dp = [-1]*(num+1)
dp[0] = 0
dp[1] = 1
dp[2] = 2
#
for i in range(3,num+1):
dp[i] = i
j=1
idx = i-1
while idx>=0:
idx = i-j*j
if dp[idx] !=-1:
if dp[idx]+1 < dp[i]:
dp[i] = dp[idx] + 1
j += 1
print(dp[num])
# 1699 2225 1149 1309 11057 9465 1932 11055 11722
import math
# 입력
num = int(input())
if num<=3:
print(num)
exit()
# 초기값 설정
dp = [-1]*(num+1)
dp[0] = 0
# DP
for i in range(1,num+1):
dp[i] = i
maxroot = int(math.sqrt(i))
for j in range(1,maxroot+1):
idx = i-j*j
if dp[idx]!=-1:
if dp[idx]+1<dp[i]:
dp[i] = dp[idx]+1
print(dp[num])
# 2225
#2225
import math
# 입력 k개의 정수를 더하여 n을 만들어라.
n,k = map(int,input().split())
# x개의 정수로 만들 수 있는 y의 원소를 a[x][y]라고 할 때 담아야할 것들
a = [([-1]*(n+1))]*(k+1)
# 1개의 정수로 만들 수 있는 0~n의 방법수는 각각 1개
a[0] = [1]+[0]*n
a[1] = [1]*(n+1)
# 6개의 정수로 만들수 있는 3의 방법수는
# 5개의 정수로 만들 수 있는 0부터 3까지의 방법수를 더한 것과 같다.
for i in range(2,k+1):
list = []
for j in range(n+1):
list.append(sum(a[i-1][0:j+1]))
a[i] = list[:]
print(a[-1][-1]%1000000000)
# 11054
두 리스트의 원소간의 합을 나타내는 방식
import sys
num = int(input())
sequence = [int(i) for i in sys.stdin.readline().rstrip().split()]
dp = [1]*num
# 먼저 i로 끝나는 증가수열의 길이를 찾고.
for i in range(num):
present_number = sequence[i]
dp[i] = 1
for j in range(i):
if sequence[j]<sequence[i]:
if dp[i]<dp[j]+1:
dp[i] = dp[j]+1
#print(dp)
# (X)먼저 i로 시작하는 감소수열의 길이를 찾는다.
# => 그냥 시퀀스를 뒤집어서 위와 똑같이 i로 끝나는 증가수열을 찾는다
sequence.reverse()
dp2 = [1]*num
for i in range(num):
present_number = sequence[i]
dp2[i] = 1
for j in range(i):
if sequence[j]<sequence[i]:
if dp2[i]<dp2[j]+1:
dp2[i] = dp2[j]+1
dp2.reverse()
#print(dp2)
# 둘의 더한 후 -1을 하고 출력해준다.
print(max( [ x+y for x,y in zip(dp,dp2)] )-1 )
'거대한 정보의 더미들 > 파이썬 코딩테스트 정리' 카테고리의 다른 글
다익스트라 알고리즘 (0) | 2024.02.21 |
---|---|
구현 (0) | 2024.02.17 |
230128 다이나믹 프로그래밍의 개념 (0) | 2023.01.27 |
230127 에라토스테네스의 체, 파이썬 시간초과, 백준 6588번 (2) | 2023.01.27 |
230125 에라스토테네스의 체, and와 Short Circuit Evaluation (1) | 2023.01.25 |