纸牌问题

 

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]);
    }

  

posted @ 2021-09-05 16:25  sherry001  阅读(35)  评论(0编辑  收藏  举报