문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
예제 입력 1 복사
6
10 20 10 30 20 50
예제 출력 1 복사
4
[소스 코드]
이중 for문을 이용하여 푸는 dp문제이다.
수열의 시작이 어디가 될지 모르기 때문에 이중 for문을 사용하였다.
문제의 예시를 살펴보자
<arr>
0 | 1 | 2 | 3 | 4 | 5 |
10 | 20 | 10 | 30 | 20 | 50 |
<dp>
0 | 1 | 2 | 3 | 4 | 5 |
1 | 2 | 1 | 3 | 2 | 4 |
i = 0 일 때는 10이라는 원소 하나로 부분 수열을 만들기 때문에 당연히 1이 된다.
i = 1 / j = 0
arr[1] > arr[0] : 20 < 10
dp[1] < dp[0] : 0 < 1 //dp[1]은 아직 채워지기 전이기 때문에 0으로 초기화된 상태이다
=> dp[1] = 1
dp[1] = 1 + 1 = 2
i = 2 / j = 0
arr[2] == arr[0] : 10 == 10
x
i = 2 / j = 1
arr[2] < arr[1] : 10 < 20
x
dp[2] = 0 + 1 = 1
i = 3 / j = 0
arr[3] > arr[0] : 30 > 10
dp[3] < dp[0] : 0 < 1 //dp[3]은 채워지지 않은 상태
dp[3] = 1
i = 3 / j = 1
arr[3] > arr[1] : 30 > 20
dp[3] < dp[1] : 1 < 2
dp[3] = 2
i = 3 / j = 2
arr[3] > arr[2] : 30 > 10
dp[3] > dp[1] : 2 > 1
x
dp[3] = 2 + 1 = 3
...
이러한 과정을 거쳐서 dp[5]까지 채워지게 된다.
그리고는 가장 큰 값을 출력한다.
n = int(input())
arr = list(map(int,input().split()))
dp = [0 for i in range(n)]
for i in range(n):
for j in range(i):
if arr[i]>arr[j] and dp[i] < dp[j]:
dp[i] = dp[j]
dp[i] += 1
print(max(dp))
'알고리즘 > python' 카테고리의 다른 글
[python/파이썬] 백준 9465 스티커 (0) | 2022.04.27 |
---|---|
[python/파이썬] 백준 1890 점프 (0) | 2022.04.26 |
[python/파이썬] 백준 1912 연속합 (0) | 2022.04.12 |
[python/파이썬] 백준 2407 조합 (0) | 2022.04.11 |
[python/파이썬] 백준 11727 2xn 타일링2 (0) | 2022.04.08 |