//排成一条线的纸牌博弈问题
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));//动态规划
}
}
排成一条线的纸牌博弈问题
最新推荐文章于 2021-10-04 13:22:49 发布