알고리즘/백준
백준-11052번/카드 구매하기
연향동큰손
2024. 2. 8. 12:37
최대 지불 금액의 경우의 수를 모두 구해서 비교한다면 시간초과 오류가 발생할 것이다.
따라서 다이나믹 프로그래밍의 절차인 점화식을 만들어서 원하는 값을 구해야 겠다고 생각했다.
배열 p ==> i요소의 값은 카드 i개를 구매할때의 가격
배열 dp ==> N개의 카드를 구매할때의 최대금액 저장 배열
dp[1](카드 1개를 구매할때의 최대 금액) ==> p[1]
dp[2](카드 2개를 구매할때의 최대 금액) ==> p[1](카드 한장의 금액) + dp[1](카드 한장 살때의 최대금액)과 p[2](카드 2장의 금액) 중의 최대값
dp[3](카드 3개를 구매할때의 최대 금액) ==> p[3](카드 3장 구매할때 가격)과 (dp[2]+p[1]),(dp[1]+p[2]) 중 최대 금액
.
.
.
.
이러한 과정으로 점화식을 구할 수 있다.
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
dp[i]=Math.max(dp[i],dp[i-j]+p[j]);
}
}
<전체 코드>
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int[] dp = new int[n+1];
int[] p = new int[n+1];
for(int i=1; i<=n; i++) {
p[i]=scanner.nextInt();
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
dp[i]=Math.max(dp[i],dp[i-j]+p[j]);
}
}
System.out.println(dp[n]);
}
}