📖저자님의 책 소개 영상: https://www.youtube.com/watch?v=Q13Uj_5bH9M
🗓️TIL (this week I learned)
월 여행
화
수 몸풀기 문제2, 조약돌
목
금 -------------------------- 이 날까지 완료
long increasing subsequence(LIS): 부분 수열의 원소가 오름차순을 유지하면서 길이가 가장 긴 수열, 주어진 배열에서 가장 긴 증가하는 부분 수열의 길이를 찾는 알고리즘.
점화식
def lis(arr):
n = len(arr)
# DP 배열 초기화: 모든 요소가 자기 자신만을 포함하는 길이 1의 LIS를 형성한다.
dp = [1] * n
# DP 배열이 의미하는 바: dp[i]는 arr[i]를 마지막으로 하는 LIS의 길이를 나타낸다.
# 배열의 각 요소에 대해
for i in range(1, n):
for j in range(i):
# 증가하는 부분 수열을 찾으면 DP 배열 업데이트
if arr[i] > arr[j] and dp[i] < dp[j] + 1:
dp[i] = dp[j] + 1
# DP 배열의 최대값을 찾아 반환
return max(dp)
시간복잡도: O(n^2)
해당 알고리즘으로 풀 수 있는 문제 예시
def LCS(X, Y):
# DP 테이블 초기화
dp = [[0] * (len(Y) + 1) for _ in range(len(X) + 1)]
# DP 테이블 채우기
for i in range(1, len(X) + 1):
for j in range(1, len(Y) + 1):
if X[i - 1] == Y[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[len(X)][len(Y)]
https://school.programmers.co.kr/learn/courses/30/lessons/12945
https://school.programmers.co.kr/learn/courses/30/lessons/12900
https://school.programmers.co.kr/learn/courses/30/lessons/43105
https://school.programmers.co.kr/learn/courses/30/lessons/12913
https://school.programmers.co.kr/learn/courses/30/lessons/42897
https://school.programmers.co.kr/learn/courses/30/lessons/12905
https://school.programmers.co.kr/learn/courses/30/lessons/12983