public class Test56 { //给定一个整型数组arr,代表数值不同的纸牌排成一条线 //玩家A和玩家B依次拿走每张纸牌 //规定玩家A先拿,玩家B后拿 //但是每个玩家每次只能拿走最左或者最右的纸牌 //玩家A和玩家B都完成最优方案,返回最后胜利者的分数 public static int win2(int[] arr) { if (arr == null || arr.length == 0) { return 0; } int N = arr.length; int[][] f = new int[N][N]; int[][] s = new int[N][N]; for (int i = 0; i < N; i++) { f[i][i] = arr[i]; } for (int i = 1; i < N; i++) { int L = 0; int R = i; while (L < N && R < N) { f[L][R] = Math.max( arr[L] + s[L + 1][R], arr[R] + s[L][R - 1] ); s[L][R] = Math.min( f[L + 1][R], f[L][R - 1] ); L++; R++; } } return Math.max(f[0][N-1], s[0][N-1]); } }
09-26
1538
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-19
330
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)