[자료구조] 알고리즘

[백준] 11052번 카드 구매하기 (다이나믹 프로그래밍_JAVA)

콩지연 2023. 6. 24. 11:20

반복문 하나로 처리하려다가

그냥 이중반복문으로 푸니까 됐다!

n이 1000이었는데 10000으로 잘 못 본 나

반성하쟈...

 

 


문제

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

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

 

 


설계

알고리즘[접근 방법] : DP

2차원 배열을 만들고, 누적합을 만든다.

현재 인덱스를 기준으로, 인덱스가 나올 수 있는 덧셈을 모두 계산해서 비교한다.

 

예를 들어, 현재 인덱스가 6이라면,

1) arr[0][6]

2) arr[0][5]+arr[0][1] 

3) arr[0][4]+arr[0][2] 

4) arr[0][3]+arr[0][3]

다음의 값들을 비교해서  제일 큰 값을 arr[1][6]에 저장한다.

 

그럼 arr[1][n]에 최종 값이 저장된다!

 

 

 


코드

import java.util.Arrays;
import java.util.Scanner;

public class Test_11052_카드구매하기 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//배열 크기 입력받기
		int n = sc.nextInt();
		
		//dp배열 생성 및 값 입력받기
		int[][] arr = new int[2][n+1];
		for(int i=1; i<n+1; i++) {
			arr[0][i]=sc.nextInt();
		}
		
		
		//누적합 만들기
		for(int i=1; i<n+1; i++) {
			int tmp = arr[0][i];	//현재 값
			
			int max=0;
			for(int j=i-1; j>=i/2; j--) {	//현재 인덱스 i가 나오는 j의 값을 더하기
				max = Math.max(max, arr[1][j]+arr[1][i-j]);
			}
			
			arr[1][i]=Math.max(tmp, max);
		}
		
		//출력
		System.out.println(arr[1][n]);
		
	}
}

 

 

(❁´◡`❁)

끝!