public class CardsInLine {
public static int win1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
return Math.max(f(arr, 0, arr.length - 1), s(arr, 0, arr.length - 1));
}
//i代表左边一位,j代表右边一位
public static int f(int[] arr, int i, int j) {
if (i == j) {
return arr[i];
}
//返回 (i的位数的值 + i的后一位到第j位的最小值) 和 (j的位数的值 + i位到j的前一位的最小值) 的最大值
return Math.max(arr[i] + s(arr, i + 1, j), arr[j] + s(arr, i, j - 1));
}
//i代表左边一位,j代表右边一位
public static int s(int[] arr, int i, int j) {
if (i == j) {
return 0;
}
//返回 (i的后一位到第j位的最大值) 和 (i位到j的前一位的最大值) 的最小值
return Math.min(f(arr, i + 1, j), f(arr, i, j - 1));
}
public static int win2(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int[][] f = new int[arr.length][arr.length];
int[][] s = new int[arr.length][arr.length];
for (int j = 0; j < arr.length; j++) {
f[j][j] = arr[j];
for (int i = j - 1; i >= 0; i--) {
f[i][j] = Math.max(arr[i] + s[i + 1][j], arr[j] + s[i][j - 1]);
s[i][j] = Math.min(f[i + 1][j], f[i][j - 1]);
}
}
return Math.max(f[0][arr.length - 1], s[0][arr.length - 1]);
}
public static void main(String[] args) {
int[] arr = { 1, 9, 1 };
System.out.println(win1(arr));
System.out.println(win2(arr));
}
}
暴力递归——最后赢家(范围)
最新推荐文章于 2024-07-14 22:18:32 发布