https://www.acmicpc.net/problem/11053
🗒️파이썬 코드 풀이
N = int(input())
lst = list(map(int,input().split()))
dp = [1] * N
for i in range(1,len(lst)):
for j in range(i):
if lst[i] > lst[j] :
dp[i] = max(dp[i],dp[j]+1)
print(max(dp))
1. 이전 값들은 계속 다음 값들에 영향을 주기 때문에 DP를 생각한다.
2. 브루트포스 방식으로 하나 하나 조사를 하고, 자신보다 작은 경우 dp 값을 갱신해준다.
3. 갱신 할 때, 가장 큰 값들만 갱신되게 하면 되므로 max 함수를 이용한다.
4. 이후 완성된 DP 리스트에 최대값을 출력하면 된다.
📌 문제 코멘트
코드 결과만 보면 DP만큼 쉬운 것도 없다. 근데 이걸 어떻게 구현하느냐가 잘 생각나지 않는다. DP 관련 문제들을 꾸준히 많이 풀어봐야 겠다.
DP에서는 max 함수를 잘 써야하는 것 같다.
📚문제
수열 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
'알고리즘 > 알고리즘_백준' 카테고리의 다른 글
[Python][백준] 1182. 부분수열의 합/ 브루트포스,백트래킹 (S2) (1) | 2024.09.18 |
---|---|
[Python][백준] 11286. 절댓값 힙 / 우선순위 큐(S1) (0) | 2024.09.18 |
[Python][백준] 11866. 요세푸스 문제 0 / 구현,큐(S4) (0) | 2024.09.11 |
[Python][백준] 10830. 행렬 제곱 / 분할정복 (G4) (0) | 2024.09.11 |
[Python][백준] 2630. 색종이 만들기 / 재귀함수,분할정복 (S2) (0) | 2024.09.09 |