https://www.acmicpc.net/problem/11568
11568번: 민균이의 계략
민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게
www.acmicpc.net
가장 긴 증가하는 부분 수열 문제인데, 문제가 처음 접하는 유형이라 어려웠다.
검색해보니 dp로 푸는 방법과 이진탐색을 이용하는 방법 두 가지가 있던데, 일단 dp로 풀어보았다.
dp[i] = num[i]를 마지막 원소로 가질 때 가장 긴 증가하는 부분 수열의 길이, 1로 초기화
dp[i] = 0~i-1까지 중 num[i]보다 작은 인덱스의 dp값 + 1과 dp[i]중 max값 갱신
import sys
input = sys.stdin.readline
N = int(input())
num = list(map(int, input().split()))
dp = [1]*N #num[i]를 마지막 원소로 가질 때 가장 긴 증가하는 부분 수열의 길이
for i in range(N):
for j in range(i):
if (num[i] > num[j]):
dp[i] = max(dp[i], dp[j]+1)
print(max(dp))
'알고리즘💻 > DP' 카테고리의 다른 글
BOJ 20303번: 할로윈의 양아치 (0) | 2021.08.18 |
---|---|
BOJ 1451번: 직사각형으로 나누기 (0) | 2021.08.02 |
BOJ 9095번: 1, 2, 3 더하기 (0) | 2021.08.01 |
BOJ 11048: 이동하기 (0) | 2021.08.01 |
BOJ 1932번: 정수 삼각형 (0) | 2021.08.01 |