현제의 현재이야기
[0210 TIL]HUFS 겨울방학 코테대비 캠프(DP) 본문
- [0 for _ in range(n)]과 [0] * n 의 차이점은 없다.
- 단순히 0을 n번 복사하는 것을 for문으로 반복하기 때문에 새로운 것을 지정해주는 것
- 하지만 [0, 0, 0] * 3 은 주소를 공유하기 때문에? 위험하다.
- ⭐️방향성⭐️이 없으면 DP를 사용할 수 없다.
- 상태에 대한 정의, 뭘 최대로 해야하나 뭘 최소로해야 문제가 풀리나를 잘 훈련해야함(like 횟수와 도달한 수만 중요하지 경로는 중요하지 않다?!)
최대 증가 부분 수열
| 문제
개의 숫자가 주어졌을 때, 가장 긴 증가 부분 수열의 길이를 구하는 프로그램을 작성해보세요
부분 수열이란 수열의 원소들 중 임의로 몇 개를 골라 순서대로 나열한 수열을 의미하고, 이때 순서대로 나열했을 때 원소들이 계속 증가한다면 이 수열을 증가 부분 수열이라고 합니다.
예를 들어,
, 주어진 수열이 이라 했을 때은 순서대로 나열해 만들 수 없으므로 부분 수열이라 할 수 없습니다.
은 부분 수열 이지만 계속 증가하는 수열이 아니므로 증가 부분 수열은 아닙니다.
은 부분 수열 이지만 역시 마찬자기로 계속 증가하는 수열이 아니므로 증가 부분 수열은 아닙니다.
는 계속 증가하는 부분 수열이므로 증가 부분 수열 입니다.
import sys
INT_MIN = -sys.maxsize
n = int(input())
dp = [0] * (n + 1)
arr = [0] + list(map(int, input().split()))
for i in range(1, n + 1):
for j in range(i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j] + 1)
print(max(dp))
- 모든 곳에서 시작할 수 있는 DP면 dp[0]에 0을 넣어두고 시작하면 된다.
- 즉, 4 , 1, 2, 3 이라는 배열에서 수열을 뽑아내야할 때, 1에서 시작할 때 1로 시작할 수 있다.
- 그러니깐 처음부터 dp[0] 의 값을 1로 지정할 수 없기 때문에(4부터 시작하지 않을 수 있기 때문에) dp[0]을 0으로 시작하여서 처음으로 시작하는 수열을 dp[j] = 1 로 넣을 수 있게 해주는 테크닉.
- 그리고 저 for i range(1, n + 1) 과 for j in range(i)를 잘 기억하자. 해당 i의 뒤를 검사하는 이중 for문이다.
'algorithm > HUFS 2023 -1 겨울 코테대비캠프' 카테고리의 다른 글
[0208 TIL]HUFS 겨울방학 코테대비 캠프(dfs, bfs) (0) | 2023.02.08 |
---|---|
[0202 TIL]HUFS 겨울방학 코테대비 캠프 (0) | 2023.02.02 |
[0131 TIL]HUFS 겨울방학 코테대비 캠프 (0) | 2023.01.31 |
Comments