11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
✏️ 내가 작성한 코드
N, A = int(input()), list(map(int,input().split()))
dp = [1]*N
for i in range(1,N): # dp[0]은 항상 1이므로 1부터 시작.
for j in range(i):
if A[j] < A[i]:
dp[i] = max(dp[j]+1,dp[i])
print(max(dp))
✏️ 참고
dp 배열 : A[i]까지의 부분수열 최장길이를 dp[i]에 넣기 위한 것.
| idx | 0 | 1 | 2 | 3 | 4 | 5 |
| A | 10 | 20 | 10 | 30 | 20 | 50 |
A배열이 이렇게 존재하고 dp[3]을 구하려면?
1) A[0] 과 A[3]비교
→ A[3]더 크므로 dp[i] = max(dp[j]+1,dp[i]) 진행.
2) dp[3] = max(dp[0]+1,dp[3])
→ 윗줄에서 A[0]보다 큰 걸 확인했으므로 A[0]의 dp값인 dp[0]보다 +1을 해주고, 현재 dp[3] =1 이랑 비교해서 max값을 dp[3]에 넣어줌
→ 현재 dp[3] = 2
3) 다음 반복문 진행. A[1]과 A[3]비교
→ A[3]더 크므로 dp[i] = max(dp[j]+1,dp[i]) 진행.
4) dp[3] = max(dp[1]+1,dp[3])
.
.
.
이런식으로 A[3]과 A[0], A[1], A[2]와 값의 크기를 비교해보고 해당 인덱스에 맞는 dp값을 비교해서 max로 뽑아오면 됨.
그럼 dp배열에는 A배열의 해당 인덱스까지의 최장 길이를 갖는 부분수열의 값들이 저장되고
거기서 또 max(dp)해서 가장 긴 값을 가져오면 된다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
| [백준][python] 10814 나이순 정렬 문제 (0) | 2023.07.05 |
|---|---|
| [백준][python] 2839 설탕 배달 문제 (0) | 2023.07.05 |
| [백준][python] 1427 소트인사이드 문제 (0) | 2023.06.26 |
| [백준][python]15969 행복 문제 (0) | 2023.06.26 |
| [백준][python]10989 수 정렬하기 3 문제 (0) | 2023.06.26 |