-
11052 카드 구매하기백준/DP 다이나믹 프로그래밍 2021. 10. 23. 16:12
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine(), " " ); int card [] = new int [N+1] ; for(int i=1; i<=N;i++) { card[i]= Integer.parseInt(st.nextToken()); } int dp [] = new int [N+1]; for(int i=1; i<=N; i++) { for(int j=1; j<=i;j++) { dp[i] = Math.max(card[j]+dp[i-j],dp[i]); } } System.out.println(dp[N]); } }
dp 를 잘 몰라서 참고해서 풀었다.
예시 입력2번에 나온 자료를 바탕으로 보면
5
10 9 8 7 6
초기 상태는,
card[i] : card i개 포함된 카드팩의 가격
card[1] =10 , card[2]= 9, card[3] =8 card[4]=7 card[5]=6
dp[i] = card i개를 구매하기 위해 지불해야 하는 최대 금액
dp[1]=0, dp[2]=0, dp[3]=0, dp[4]=0, dp[5]=0
이다.
일단 초기에 값은 0이고, 동적계획법에 의해 값이 바뀐다.
아래 설명에서 알 수 있다.
동적 계획법의 식을 생각해보면,
dp[i]= card[j]+dp[i-j]인데,
이는,
dp[i] ( card i개를 구매하기 위해 지불해야 하는 최대 금액)
= card[j](card j개 포함된 카드팩의 가격)
+ dp[i-j] ( card i-j개를 구매하기 위해 지불해야 하는 최대 금액)
이 된다.
dp[i] = Math.max(card[j]+dp[i-j],dp[i]);
이렇게 표현한 것은,
초기에 dp[1]=0 인데,
card[j]+dp[1-j]랑 비교하여 더 큰 값을 dp[1]로 입력시키는 것이다.
더 자세히 설명해서
i=1, j=1이라면
dp[1]= Math.max(card[1]+dp[0],dp[1]);
이렇게 되고,
card[1]+dp[0]= 10, dp[1]=0 이기에
dp[1]= 10 이 된다.
그리고 dp[2] = Math.max(card[j]+dp[2-j],dp[2]); 인데,
j=1 이라면
dp[2]= Math.max(card[2]+dp[1],dp[2]) =Math.max(9+10, 0)=19
이렇게 된다.
그리고 마지막 for문에서 j<=i 인 것은
dp[i] = Math.max(card[j]+dp[i-j],dp[i]);
여기서, dp[i-j]에서 i-j가 양수여야 하고
i-j >= 0
i >= j가 된다.
참고 자료 :
백준 11052 카드 구매하기 java
https://www.acmicpc.net/problem/11052카드를 총 i 개 구매하려고 한다고 가정했을때 , 만약 카드 j 개가 들어있는 카드팩 하나를 우선 구매한다면 다음에 구매해야하는 카드의 개수는 i-j 가 된다. 우리가
velog.io
'백준 > DP 다이나믹 프로그래밍' 카테고리의 다른 글
11048 이동하기 (0) 2022.05.17 가장 긴 증가하는 부분 수열 11053 (0) 2022.02.08 11057 오르막 수 (0) 2021.10.26 9465 스티커 (0) 2021.10.23 11726 2xn 타일링 (0) 2021.10.21