알고리즘 공부/문제 풀이

[JAVA] 백준 11062 카드 게임

valid_ming 2021. 9. 19. 22:46

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

 

11062번: 카드 게임

근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는

www.acmicpc.net

 

 

풀이

해결 전략은 문제를 풀며 적은 내용으로 실제 작성한 코드와 상이할 수 있습니다.
변경된 부분은 왜 변경했는지 풀이 후기에 적어 놓았으니 참고 바랍니다!

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    static int[][][] dp;
    static int[] arr;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for(int i=0; i<T; i++) {
            int N = Integer.parseInt(br.readLine());
            arr = new int[N];
            String[] input = br.readLine().split(" ");

            for(int j=0; j<N; j++)
                arr[j] = Integer.parseInt(input[j]);

            dp = new int[2][N][N];

            int max = dfs(0, N-1, 1);

            System.out.println(max);
        }
    }

    public static int dfs(int left, int right, int turn) {
        if(left>right) return 0;

        int res = dp[turn][left][right];

        if(res!=0) return res;

        if(turn==1)
            res = Math.max(dfs(left+1, right, 0)+arr[left], dfs(left, right-1, 0)+arr[right]);

        else
            res = Math.min(dfs(left+1, right, 1), dfs(left, right-1, 1));

        return dp[turn][left][right] = res;
    }
}