알고리즘

백준 2616번 소형기관차 (JAVA)

박카스마시며코딩 2023. 7. 12. 10:42

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

 

2616번: 소형기관차

첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있

www.acmicpc.net

 

저는 DP를 이용하여 문제를 해결하였습니다.

저는 DP를 dp[depth][소형기관차를 사용한 횟수]로 지정하여 문제를 풀었습니다.

함수는 기관차를 사용하지 않는다면 다음 뎁스로 사용한다면 객차를 끌 수 있는 수 만큼의 다음 뎁스로 넘어가면서 답을 구하였습니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_2616 {

    private static final int NOT_VALID = -1;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String, Integer> stoi = Integer::parseInt;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = stoi.apply(st.nextToken());
        int[] input = new int[n];
        st = new StringTokenizer(br.readLine());
        int[][] dp = new int[n][3+1];
        for (int i = 0; i < n; i++) {
            Arrays.fill(dp[i], NOT_VALID);
            input[i] = stoi.apply(st.nextToken());
        }
        int interval = stoi.apply(br.readLine());
        int result = cal(0, 0, interval, input, n, dp);
        System.out.println(result);
    }

    private static int cal(int depth, int cnt, int interval, int[] input, int n, int[][] dp) {
        if (depth >= n) {
            return 0;
        }
        if (dp[depth][cnt] != NOT_VALID) {
            return dp[depth][cnt];
        }
        int result = 0;
        result = Math.max(result, cal(depth + 1, cnt, interval, input, n, dp));
        if (depth + interval <= n && cnt < 3) {
            int sum = 0;
            for (int i = 0; i < interval; i++) {
                sum += input[depth + i];
            }
            result = Math.max(result, cal(depth + interval, cnt + 1, interval, input, n, dp) + sum);
        }
        dp[depth][cnt] = result;
        return result;
    }
}