给定一个整数数组arr,代表不同的纸牌排成一条线,玩家A和玩家B依次拿走每张牌,规定A玩家先拿,B玩家后拿, 但是每个玩家只能拿走最左侧或者最右侧的纸牌 玩家A和玩家B都是绝顶聪明的,请返回最后获胜者的分数;
暴力递归
1.基本思想,定义两个递归函数,第一个先手在一个范围上取的获得最大值;第二个函数在一个范围上后手获取的最大值;
2.范围先手最大值 = MAX(取左侧之后+在剩下范围的最为后手,取右侧后 + 剩下范围作为后手);
3.范围后手最大值 = MIN(先手取左侧剩下范围的我最为先手,先手取右侧 剩下范围我作为先手);
暴力解法
/**
* 递归版本
*/
private int getCarInLineRecur(int[] arr) {
if (arr.length == 0) {
return 0;
}
return Math.max(first(arr, 0, arr.length - 1),
second(arr, 0, arr.length - 1));
}
/**
* 先手取牌的最大值
*/
private int first(int[] arr, int L, int R) {
if (L == R) return arr[L];
return Math.max(arr[L] + second(arr, L + 1, R), //先手取左侧的值,在[L+1,R] 进行后手取牌
arr[R] + sec