https://www.bilibili.com/video/BV1jE411s7rT?p=7
140:00
动态规划如果想学可以看看
public static int win(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));
}
//f()相对先选者,s()相对后选者,ij表示哪一段
public static int f(int []arr, int i , int j ) {
if (i == j) {
//只剩一张牌
return arr[i];
}
// return Math.max(arr[i]+s(arr,i+1,j),arr[j]+s(arr,i,j+1))
//如果只考虑arr[i]arr[j]那就成贪心算法了,还要考虑 s() 选完后的牌,整体最大,
//如何做到整体呢?递归交给上一层
//如果拿走i张牌接下来要面对[i+1,j]的后发身份
return Math.max(arr[i] + s(arr, i + 1, j), arr[j] + s(arr, i, j - 1))
}
public static int s(int []arr, int i ,int j ){
if(i==j){
return 0;
}
//return Math.max(arr[i]+s(arr, i+ 1,j),arr[j]+s(arr, i , i-1));
//对方拿走左边,我是[i+1,j]的先发,对方拿走j我的[i,j+1]的先发
//零和博弈,对方要胜利会让我拿更小的值
return Math.min(f(arr,i+1,j),f(arr,i,j-1));
}
public static void main(String[] args) {
int a[] = {1,2,3,4,5,6};
//int num = win(a);
System.out.println(win(a));
}
}