-
[다이나믹 프로그래밍] 문제 이름 : 개미 전사Algorithm/유형별 문제 풀기 2021. 12. 21. 11:52
문제 설명
여러 개의 식량창고가 존재하고, 식량창고는 일직선으로 이어져 있다. 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있기 때문에 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다.
식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최대값을 구하는 프로그램을 작성하시오.
입력 조건
- 첫째 줄에 식량창고의 개수 N이 주어진다. (3 <= N <= 100)
- 둘째 줄에 공백으로 구분되어 각 식량창고에 저장된 식량의 개수 K가 주어진다. (0 <= K <= 1,000)
출력 조건
- 첫째 줄에 개미 전사가 얻을 수 있는 식량의 최대값을 출력하시오.
사용 개념
다이나믹 프로그래밍 진행 (보텀업)
문제 해결 아이디어
*간단 순서
1. 주어진 문제를 해결하기 위한 도식화
2. 점화식 세우기
*설명
왼쪽부터 차례대로 식량창고를 턴다고 가정하면,
i 번째 식량창고에 대해서는
- (i-1) 번째 식량창고를 터는 경우
- (i-2) 번째 + i 번째 식량창고를 터는 경우
위의 2가지 경우에 대해서만 확인하면 됨
(i-3) 번째 이하의 식량창고에 대해서는 한 칸 이상 떨어진 식량창고는 항상 털 수 있기 때문에 고려할 필요가 X
i 번째 식량창고에 있는 식량의 양이 kᵢ라고 했을 때 점화식은 . .
코드
import java.util.*; public class Q2 { // 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 public static int[] d = new int[100]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 정수 N을 입력받기 int n = sc.nextInt(); // 모든 식량 정보 입력받기 int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } // 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업) d[0] = arr[0]; d[1] = Math.max(arr[0], arr[1]); for (int i = 2; i < n; i++) { d[i] = Math.max(d[i - 1], d[i - 2] + arr[i]); } // 계산된 결과 출력 System.out.println(d[n - 1]); // 식량의 최대값 } }
'Algorithm > 유형별 문제 풀기' 카테고리의 다른 글
[다이나믹 프로그래밍] 문제 이름 : 효율적인 화폐 구성 (0) 2021.12.22 [다이나믹 프로그래밍] 문제 이름 : 바닥 공사 (0) 2021.12.21 [다이나믹 프로그래밍] 문제 이름 : 1로 만들기 (0) 2021.11.24 [이진 탐색] 문제 이름 : 떡볶이 떡 만들기 - 파라메트릭 서치 (0) 2021.11.22 [이진 탐색] 문제 이름 : 부품 찾기 - 배열 Sort, Binary Search (0) 2021.11.18