1. 程式人生 > 其它 >排成一條線的紙牌博弈問題

排成一條線的紙牌博弈問題

連結
給定一個整型陣列arr,代表數值不同的紙牌排成一條線,玩家A和玩家B依次拿走每張紙牌,規定玩家A先拿,玩家B後拿,但是每個玩家每次只能拿走最左和最右的紙牌,玩家A和玩家B絕頂聰明。請返回最後的獲勝者的分數。

import java.util.Scanner;

public class Main {

    private static int first(int[] arr, int L, int R) {
        if (L == R) {
            return 0;
        }
        return Math.max(arr[L] + second(arr, L + 1, R), arr[R] + second(arr, L, R - 1));
    }

    private static int second(int[] arr, int L, int R) {
        if (L == R) {
            return 0;
        }
        return Math.min(first(arr, L + 1, R), first(arr, L, R - 1));
    }

    private static int solve(int[] arr) {
        int n = arr.length;
        int[][] first = new int[n][n];
        int[][] second = new int[n][n];
        for (int i = 0; i < n; ++i) {
            first[i][i] = arr[i];
        }

        for (int L = n - 2; L >= 0; --L) {
            for (int R = L + 1; R < n; ++R) {
                first[L][R] = Math.max(arr[L] + second[L + 1][R], arr[R] + second[L][R - 1]);
                second[L][R] = Math.min(first[L + 1][R], first[L][R - 1]);
            }
        }

        return Math.max(first[0][n - 1], second[0][n - 1]);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; ++i) {
                arr[i] = in.nextInt();
            }
            System.out.println(solve(arr));
        }
    }
}
心之所向,素履以往 生如逆旅,一葦以航