排成一条线的纸牌博弈问题

//排成一条线的纸牌博弈问题
public class CardProblem{
	
	//暴力递归方法(时间复杂度O(2^n),空间复杂度O(n))
	public static int win01(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));
	}
	//先选的最优函数
	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));
	}
	//后选的最优函数
	public static int s(int[]arr,int i,int j)
	{
		if(i==j)
		{
			return 0;
		}

		return Math.min(f(arr,i+1,j),f(arr,i,j-1));

	}
//*******************************************************************************
	//动态规划法(时间复杂度O(n^2),空间复杂度O(n^2))
	public static int win02(int[]arr)
	{
		if(arr==null||arr.length==0)
		{
			return 0;
		}
		//生成动态规划矩阵
		int[][]f=new int[arr.length][arr.length];//先选的最优函数矩阵
		int[][]s=new int[arr.length][arr.length];//后选的最优函数矩阵

		for(int j=0;j<arr.length;j++)
		{
			f[j][j]=arr[j];//对角线位置取值
			for(int i=j-1;i>=0;i--)
			{
				f[i][j]=Math.max(arr[i]+s[i+1][j],arr[j]+s[i][j-1]);
				s[i][j]=Math.min(f[i+1][j],f[i][j-1]);
			}

		}
        return Math.max(f[0][arr.length-1],s[0][arr.length-1]);

	}


	public static void main(String[]args)
	{
        int[]arr={1,2,100,4};
     
        System.out.println(win01(arr));//暴力递归
        System.out.println(win02(arr));//动态规划

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值