알고리즘/DynamicProgramming

푼 dp 유형 정리

꽃요미 2025. 2. 27. 22:21

1. 초급 DP

 

* 1 2 3 더하기

https://www.acmicpc.net/problem/9095

 

- 간단하게 첫번째 두번째 세번째 경우의 수만 구하면 규칙이 보이는 문제.

- 여기서 dp는 점화식을 세우기 전에 초기값을 먼저 할당하고 점화식을 세우는게 중요하다고 느낌

 

* 1로 만들기

https://www.acmicpc.net/problem/1463

 

* 계단 오르기

https://www.acmicpc.net/problem/2579

 

* 포도주 시식

https://www.acmicpc.net/problem/2156

 

- 둘다 3번연속 선택 못 한다는 조건이 존재

- 3개의 초기값을 설정 후에 점화식을 세워야함

- 계단 오르기는 마지막 계단은 꼭 밟아야 하기때문에 점화식을 세울때 현재 밟고 있는 계단은 꼭 값으로 포함시켜 줘야함

- 포도주 시식은 문제에 언급은 없지만 포함안시켜도 가능. 

- 포도주 시식의 점화식이 조금 더 길다.

 

2. 중급 DP

 

* LIS ( Longest Increament Sequence ) 최장 증가 수열

https://www.acmicpc.net/problem/11053

 

- 배열이 주어지고 그 중에 가장긴 증가 수열을 찾는 문제

- dp 배열을 1로 초기화 하고 증가 수열 발견 할때마다 값을 갱신시킴

 

* 연속 합

https://www.acmicpc.net/problem/1912

 

- 배열이 주어지고 그 중에 가장 큰 연속 합을 찾는 문제

- dp 배열로 초기값을 할당

- dp 배열의 i-1 값과 현재값을 비교하여 큰 값을 dp 배열에 할당

 

* 최대 부분 수열

https://songkc5671.tistory.com/62

 

최대 부분 수열

 

songkc5671.tistory.com

- 배열이 주어지고 2개의 K길이의 합중 최대값 반환.

- SlidingWindow로 값을 저장 후 중복되지 않는 범위에서 최댓값 반환.

 

* 카드 구매하기

https://www.acmicpc.net/problem/11052

 

- 첫번째부터 1개의 카드팩을 구매하는데 발생하는 비용, 2개의 카드팩을 구매하는데 발생하는 비용...

- 출력값을 N번째의 카드팩을 구매할때 지불해야하는 최대금액(최댓값) 출력하면 된다

- 배낭문제와 비슷하게 현재 카드팩 수량을 빼고 금액을 갱신해주면 된다

 

* 평범한 배낭문제

https://www.acmicpc.net/problem/12865

 

- 가방의 물품의 수와 버틸 수 있는 무게가 주어진다.

- 물품의 무게와 가치가 차례로 주어지는데 획득 할 수 있는 최대 가치를 출력하면 된다

- 위의 카드 구매하기 문제에서 '무게' 변수만 추가한 버전이라고 생각하면 된다

- 카드 문제에서는 카드팩 수량을 빼고 금액을 갱신했지만

배낭 문제에서는 무게를 빼고 가치를 갱신하면 된다.

 

정리

LIS : 증가하는 수열의 최대 길이를 찾는 문제

연속합 : 연속한 수열중에 최댓값을 반환하는 문제

최대 부분 수열 : dp 보다는 투 포인터를 사용해서 최댓값을 구하는 문제

카드 구매하기 : i 번째까지 고려했을때 획득 가능한 최댓값 반환하는 문제

평번한 배낭문제 : i 번째까지 고려했을때 획득 가능한 최댓값 반환하는 문제

+ 무게까지 고려해야해서 dp[][] 이차원 배열을 사용해야함