//龙与地下城游戏问题
public class DragonGame{
//经典的动态规划法
public static int minHp01(int [][]map)
{
if(map==null||map.length==0||map[0]==null||map[0].length==0)
{
return 1;
}
int row=map.length;
int col=map[0].length;
//构造动态规划表
int[][]dp=new int[row--][col--];
//矩阵的右下角的位置
dp[row][col]=map[row][col]>0?1:-map[row][col]+1;
//最后一行的计算
for(int j=col-1;j>=0;j--)
{
dp[row][j]=Math.max(dp[row][j+1]-map[row][j],1);
}
int right=0;
int down=0;
for(int i=row-1;i>=0;i--)
{
dp[i][col]=Math.max(dp[i+1][col]-map[i][col],1);
for(int j=col-1;j>=0;j--)
{
right=Math.max(dp[i][j+1]-map[i][j],1); //向右走
down=Math.max(dp[i+1][j]-map[i][j],1); //向下走
dp[i][j]=Math.min(right,down);
}
}
return dp[0][0]; //返回最后一个位置的值
}
//压缩版的动态规划(滚动法)
public static int minHp02(int[][]map)
{
if(map==null||map.length==0||map[0]==null||map[0].length==0)
{
return 1;
}
int more=Math.max(map.length,map[0].length);
int less=Math.min(map.length,map[0].length);
boolean rowmore=more==map.length;
//构造动态规划矩阵
int[]dp=new int[less];
int temp=map[map.length-1][map[0].length-1];
dp[less-1]=temp>0?1:-temp+1;
int row=0;
int col=0;
for(int j=less-2;j>=0;j--)
{
row=rowmore?more-1:j;
col=rowmore?j:more-1;
dp[j]=Math.max(dp[j+1]-map[row][col],1);
}
int chooesn1=0;
int choosen2=0;
for(int i=more-2;i>=0;i--)
{
row=rowmore?i:less-1;
col=rowmore?less-1:i;
dp[less-1]=Math.max(dp[less-1]-map[row][col],1);
for(int j=less-2;j>=0;j--)
{
row=rowmore?i:j;
col=rowmore?j:i;
chooesn1=Math.max(dp[j]-map[row][col],1);
choosen2=Math.max(dp[j+1]-map[row][col],1);
dp[j]=Math.min(chooesn1,choosen2);
}
}
return dp[0];
}
public static void main(String[]args)
{
//游戏矩阵
int[][]map={
{-2,-2,3},
{-5,-10,1},
{0,30,-5}
};
System.out.println(minHp01(map));
System.out.println(minHp02(map));
}
}
龙与地下城游戏问题
最新推荐文章于 2023-03-04 18:17:36 发布