티스토리 뷰
N = int(input())
nums = list(map(int,input().split()))
dp = [1]*N
for i in range(N):
for j in range(i): #이전까지 작았다면 해당 dp것에 +1해서 max값 넣기
if nums[i] > nums[j]:
dp[i] = max(dp[i],dp[j]+1) #메모이제이션
print(max(dp))
처음 dp배열을 1로 세팅해준다. 이유는? 각 원소값이 자기자신이여도 한번 카운트 된다 생각하기 때문
초기
nums = [10, 20, 10, 30, 20, 50]
dp = [1,1,1,1,1,1]
이중 배열로 비교 대상 원소nums[i]보다 그전에 있었던 배열의 원소가 작았던게 있으면 그 비교 대상이 더 큰거니까 +1 해주면서 최댓값을 찾으며 i만큼 반복문을 돈다.
예를 들어 i=1일때 dp는 =[1,1,1,1,1,1]이고 nums[1] > nums[0]이므로 dp[1] = max(dp[1],dp[0]+1)을 통해 dp[1] = 2가 된다. dp = [1,2,1,1,1,1]
i = 2일 때 nums[2] > nums[0], nums[2] > nums[1] 이 성립하지 않음 따라서 dp = [1,2,1,1,1,1]으로 변하지 않음
i = 3일 때 num[3] > nums[0] 이므로 dp[3] = max(dp[3],dp[0]+1)을 통해 dp[3] = 2가 된다. dp = [1,2,1,2,1,1]
num[3] > nums[1] 이므로 dp[3] = max(dp[3],dp[1]+1)을 통해 dp[3] = 3이 된다. dp = [1,2,1,3,1,1]
num[3] > nums[2] 이므로 dp[3] = max(dp[3],dp[2]+1)을 통해 dp[3] = 3이 된다. dp = [1,2,1,3,1,1]
...이런식으로 각 dp배열의 메모이제이션한 값과 비교해가며 dp를 갱신해준다.
최종
dp = [1, 2, 1, 3, 2, 4]
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1541. 잃어버린 괄호 - 파이썬 (0) | 2021.07.17 |
---|---|
[백준] 1912. 연속합 - 파이썬 (0) | 2021.07.12 |
[백준] 2193. 이친수 - 파이썬 (0) | 2021.07.07 |
[백준] 16194. 카드 구매하기 2 - 파이썬 (0) | 2021.07.06 |
[백준] 11052 . 카드 구매하기 - 파이썬 (0) | 2021.07.06 |
- Total
- Today
- Yesterday
- 알고리즘
- 자바
- vue.js
- Python
- DOM
- Pyhton
- SSAFY퇴소
- javascript
- 프로그래머스
- 비동기패턴
- 싸피
- django
- 독학
- SSAFY
- 파이썬
- 세션 스토리지
- git
- N과M
- 위클리챌린지2주차
- AWS
- commit되돌리기
- Java
- 백준
- vue
- splide
- 트리
- 배포
- SWEA
- 안드로이드스튜디오
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |