99클럽 코테 스터디 28일차 TIL - DP(백준11055-가장 큰 증가하는 부분 수열 )
반응형
https://www.acmicpc.net/problem/11055
- 오늘의 학습 키워드 : DP
- 공부한 내용
예시로
작동 과정 예시 (입력: 10, [1, 100, 2, 50, 60, 3, 5, 6, 7, 8])
- 초기 dp = [1, 100, 2, 50, 60, 3, 5, 6, 7, 8]
- 루프 동작:
- i=1: dp[1] = max(dp[1], dp[0] + A[1]) → 101
- i=3: dp[3] = max(dp[3], dp[0] + A[3], dp[2] + A[3]) → 51
- ...
- i=9: dp[9] = max(dp[9], dp[6] + A[9], ..., dp[8] + A[9]) → 113
- 최종 dp = [1, 101, 2, 51, 111, 6, 11, 17, 24, 113]
- 결과: max(dp) = 113
1. dp[i]는 i번째 요소로 끝나는 최대 합을 저장한다.
2. A[j] < A[i] 조건을 확인하며 이전 값들의 최대 합을 재활용한다.
3. 모든 요소를 처리한 후, max(dp)로 결과를 구한다.
🎯 DP 풀이
import sys
# 입력 받기: 수열의 길이 N과 수열 A
N = int(sys.stdin.readline().strip()) # 수열의 길이
A = list(map(int, sys.stdin.readline().strip().split())) # 수열
# dp 배열 초기화: dp[i]는 A[i]를 마지막으로 하는 최대 합 증가 부분 수열의 합
dp = A.copy() # 각 요소는 초기값으로 자기 자신을 포함한 부분 수열의 합
# 반복문을 통해 dp 배열 계산
for i in range(1, N): # i는 현재 위치 (A[i]를 마지막으로 고려)
for j in range(i): # j는 i 이전의 모든 위치를 탐색
if A[j] < A[i]: # 증가 조건: A[j]가 A[i]보다 작아야 증가 수열
# dp[i]를 갱신: 이전 최대 합(dp[j])에 A[i]를 추가한 값과 기존 dp[i] 중 큰 값 선택
dp[i] = max(dp[i], dp[j] + A[i])
# dp 배열에서 가장 큰 값이 답: 최대 합 증가 부분 수열의 합
print(max(dp))
- 오늘의 공부 회고
- dp는 아직까지는 풀수 있을정도..? 실버정도는 그래도 풀수있을것 같다..
반응형
'Python > 😈 99클럽 코테 스터디 4기 TIL' 카테고리의 다른 글
99클럽 코테 스터디 29일차 TIL - DP(백준9461-파도반 수열 ) (0) | 2024.11.25 |
---|---|
99클럽 코테 스터디 27일차 TIL - DP(백준11722-가장 긴 감소하는 부분 수열 ) (0) | 2024.11.23 |
99클럽 코테 스터디 26일차 TIL - DP(백준-전력망을 둘로 나누기) (0) | 2024.11.22 |
99클럽 코테 스터디 24일차 TIL - 완전탐색(프로그래머스-전력망을 둘로 나누기) (0) | 2024.11.20 |
99클럽 코테 스터디 23일차 TIL - 완전탐색(프로그래머스- 소수찾기) (0) | 2024.11.20 |