纸牌问题
public static int getWin(int[] arr){
return Math.max(f(arr,0,arr.length-1),s(arr,0,arr.length-1));
}
public static int f(int[] arr,int l,int r){
//只有一张牌
if(l==r){
return arr[l];
}
//拿左边的一张,那在l+1,r上变成了后手
int s1= arr[l]+s(arr,l+1,r);
//拿右边的一张,那在l,r-1
int s2= arr[r]+s(arr,l,r-1);
return Math.max(s1,s2);
//return Math.max(arr[l]+s(arr,l+1,r),arr[r]+s(arr,l,r-1));
}
public static int s(int[] arr,int l,int r){
//只有一张牌
if(l==r){
return 0;
}
//先手拿了l,在L+1,r上变成了新手
int p1=f(arr,l+1,r);
//先手拿了r ,在l,r-1上变成了新手
int p2=f(arr,l,r-1);
//被动拿最小的
return Math.min(p1,p2);
// return Math.min(f(arr,l+1,r),f(arr,l,r-1));
}
转动态规划
public static int wins2dp(int[] arr){
//L 0-n-1 0-nu1
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]);
}

浙公网安备 33010602011771号