从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划
package day_16;
/**
* 给定一个整型数组arr,代表数值不同的纸牌排成一条线
* 玩家A和玩家B依次拿走每张纸牌
* 规定玩家A先拿,玩家B后拿
* 但是每个玩家每次只能拿走最左或最右的纸牌
* 玩家A和玩家B都绝顶聪明
* 请返回最后获胜者的分数。
* @Author huawei
* @Date 2021/5/12 16:44
* @Version 1.0
*/
public class Code02_CardsInLine{
public static int win1(int [] array){
if(array == null || array.length == 0){
return -1;
}
return Math.max(b(array,0,array.length-1),a(array,0,array.length - 1));
}
/**
* 在L...R的范围之内先手
* @param array
* @return
*/
public static int b(int [] array,int L,int R){
if( L == R ){
// 说明只剩一张牌
return array[L];
}
// 先手拿 分为两种情况,第一种,先手拿左 + 后手拿 ,第二种,先手拿右 + 后手拿
// 这个后手就看成是一个黑盒,因为是绝顶聪明,所以一定会取这两次最大的值
return Math.max(array[L] + a(array,L + 1,R),array[R] + a(array,L,R - 1));
}
public static int a(int [] array,int L,int R){
if(L == R){
// 如果只剩一张牌,因为是后手,所以这张牌一定被对方的先手拿走,因为是绝顶聪明
return 0