문제 : https://www.acmicpc.net/problem/11053
DP 문제 중에 유명한 문제다.
Longest Increasing Subsequence LIS라는 문제다.
이 문제는 DP로 풀면 O(n^2) 가 나오고, binary search 등을 이용하면 O(nlogn)까지 줄일 수 있다고 한다.
물론 난 안줄인다. ㅎㅎ
dp 배열을 만들고, 다음과 같은 순서로 푼다
- 0 ~ n-1 k 동안
- dp [i]를 1로 하고
- 0 ~ k-1 인 i 중에서 line [i] < line [k] , 즉 k 번째보다 작은 값을 보면
- dp [k], dp [i]+1 중에서 큰 값을 선택한다.
- DP 배열중에 가장 큰 값을 고른다.
import sys
n = int(sys.stdin.readline())
line = [int(i) for i in sys.stdin.readline().rstrip().split()]
dp = [0] * n
if n ==1:
print(1)
sys.exit()
for k in range(n):
dp[k] = 1
for i in range(k):
if line[i]<line[k]:
dp[k] = max(dp[k], dp[i]+1)
print(max(dp))
'취준 > 백준' 카테고리의 다른 글
[백준][Python][1309][DP] 동물원 (0) | 2020.02.21 |
---|---|
[백준][Python][14889][브루트포스] 스타트와 링크 (0) | 2020.02.19 |
[백준][Python][10815][이분탐색] 숫자 카드 (0) | 2020.02.18 |
[백준][Python][10816][이분탐색] 숫자 카드 2 (0) | 2020.02.18 |
[백준][Python][1931][그리디] 회의실배정 (0) | 2020.02.17 |