纸牌问题
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]); }