龙与地下城游戏问题

//龙与地下城游戏问题
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));

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值