알고리즘/자료구조와 알고리즘
<문제> 개미 전사 (Dynamic Programming)
정석이
2022. 2. 21. 18:55
문제 1. 개미 전사
DP를 활용하여 문제를 풀 수 있다.
문제를 해결하기 위해 i번째 식량창고까지의 최적의 해를 살펴보자
창고 0에서 최적의 해는 1이다.
창고 1에서 최적의 해는 1과 3을 비교했을 때 큰 값인 3이다.
창고 2에서 최적의 해는 1+1인 2와 3을 비교했을 때 큰 값인 3이다.
창고 4에서 최적의 해는 1+1인 2와 3+5인 8을 비교했을 때 큰 값인 8이다.
이런식으로 차례로 DP에 넣어 확인할 수 있다.
왼쪽부터 차례대로 식량창고를 털 때 i 번째를 털지 안털지의 여부는 2가지가 있다.
바로 앞의 창고가 털렸다면 i번째 창고는 털 수 없으며
털리지 않았다면 i번째 창고를 털 수 있다.
두 가지 중에 더 많은 식량을 털 수 있는 경우를 선택하면 된다.
글고 i - 1번째와 i - 2번째만 살펴보면 됨 i - 3부터는 그 이전에 경우를 고려해서 계산을 마쳐놨을텡께
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class AntWorrier { // 개미전사 DP
public static void main(String[] args) throws IOException{
int warehouse[];
int d[] = new int[100];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
warehouse = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++)
warehouse[i] = Integer.parseInt(st.nextToken());
d[0] = warehouse[0];
d[1] = Math.max(warehouse[0], warehouse[1]);
for(int i = 2; i < N; i++)
d[i] = Math.max(d[i - 1], d[i - 2] + warehouse[i]);
System.out.println(d[N - 1]);
}
}
출처 : https://www.youtube.com/watch?v=5Lu34WIx2Us&t=1495s