给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数 组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。
给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。
两个值的时候必然是取较大的,三个值,取一个能使自己分数和最大的,后手必然留较小的给先手,因此先手选一个值加上该较小值最大化
递归
上代码:
//23石子游戏
public class CanWin23 {
public static void main(String[] args) {
int[] arr = new int[]{5,200,2,3,6};
int sum =0;
for (int i:arr){
sum+=i;
}
int p1 = maxScope(arr,0,arr.length-1);
System.out.println(p1>sum-p1);
}
static int maxScope(int[] arr,int l,int r ){
if (l==r){
return arr[l];
}
int sLeft =0,rRight = 0;
if (r-l==1){
sLeft = arr[l];
rRight = arr[r];
}
if (r-l>=2){
sLeft = arr[l] + Math.min(maxScope(arr,l+2,r),maxScope(arr,l+1,r-1));
rRight = arr[r] + Math.min(maxScope(arr,l+1,r-1),maxScope(arr, l, r-2));
}
return Math.max(sLeft,rRight);
}
}
结果:
false