https://www.acmicpc.net/problem/11052
핵심
이 문제는 DP를 사용하여 쉽게 풀 수 있다.
테이블 정의 - DP [i] = 카드가 i개일 때 지불해야 하는 최대 금액
점화식 찾기
카드가 1개 들어있는 카드팩을 구매하고 카드 i-1개를 구입한다.
카드가 2개 들어있는 카드팩을 구매하고 카드 i-2개를 구입한다.
카드가 3개 들어있는 카드팩을 구매하고 카드 i-3개를 구입한다.
정답 코드
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] dp = new int[N + 1];
int[] cards = new int[N + 1];
for (int i = 1; i <=N; i++){
cards[i] = sc.nextInt();
for (int j = 1; j<=i; j++){
dp[i] = Math.max(dp[i], dp[i - j] + cards[j]);
}
}
System.out.println(dp[N]);
}
}
해설
위에서 말한 대로 DP를 적용하여 쉽게 풀 수 있다.
각 dp에는 i값에 따라 i의 카드 팩을 구매할 때 최대 금액을 담게 된다.
배운 점
DP를 익히는데 좋은 문제라고 생각된다.
DP에 대해 아직 부족하고 DP를 학습하고 싶다면, 이러한 문제부터 시작하는 것이 좋을 것 같다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[SWEA] 13736번 사탕 분배 - 분할 정복(java) (0) | 2023.02.02 |
---|---|
[SWEA] 7701번 염라대왕의 이름정렬 - 정렬(java) (1) | 2023.02.01 |
[백준] 16948번 데스 나이트(java) (1) | 2023.01.30 |
[프로그래머스] 이중우선순위큐 (0) | 2023.01.29 |
[프로그래머스] 소수 찾기(java) (0) | 2023.01.29 |