排成一條線的紙牌博弈問題
阿新 • • 發佈:2021-10-20
連結
給定一個整型陣列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)); } } }