정답률이 59퍼센트인 dp문제이다. 역시 dp문제는 나같은 초보자에게는
정답률과 상관없이 점화식을 떠올리기 참 힘든 문제인 것 같다.
문제를 간단히 설명하자면
민규가 N개의 카드를 갖기 위해 지불해야 하는 최대 금액을 출력하는 문제이다.
입력으로는 갖기 위한 카드개수 N개와
1장이 들어있는 카드팩 가격
2장이 들어있는 카드팩 가격
.
.
.
N장이 들어있는 카드팩 가격이 주어진다.
예를 들어 N이 18이라면
정답은
16장이 들어있는 카드팩 가격 + 2장이 들어있는 카드팩 가격 이 될 수 도 있고
15장 + 3장
14장 + 4장
여러가지 경우의 수가 있다.
dp로 풀어야하는 전형적인 문제이다.
점화식을 열심히 고민해봤지만 이번에도 역시 떠올리지 못했다.
정답은 위에서 말한 것 처럼
이중 for문을 사용해서 전부 비교해보면 되는 것이었다.
왜 그 생각을 못했을까..
dp[i]에는 i장의 카드를 살 경우의 최대금액이다.
dp[5]인 경우에는
4장을 사기위한 최대 값 + 1장 팩 값
3장을 사기위한 최대 값 + 2장 팩 값
2장을 사기위한 최대 값 + 3장 팩 값
1장을 사기위한 최대 값 + 4장 팩 값
중에 가장 큰 수가 들어가는 것이다.
dp는 정말 생각해내기 어렵다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] a = new int[n+1];
int [] dp = new int[n+1];
for(int i=1; i<=n; i++)
a[i] = scan.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
}
}
System.out.println(dp[n]);
}
|
'Algorithm' 카테고리의 다른 글
백준 1107 리모컨 Java (0) | 2019.05.14 |
---|---|
백준 1201 NMK Java (0) | 2019.05.13 |
백준 2109 순회강연 Java (0) | 2019.05.11 |
백준 1931 회의실배정 Java (0) | 2019.05.10 |
백준 1541 잃어버린 괄호 Java (0) | 2019.05.10 |