骑士与地下城游戏

 

给定一个二维数组map,含义是一张地图,例如,如下矩阵
游戏的规则如下:
1)骑士从左上角出发,每次只能向右或向下走,最后到达右下角见到公主。
2)地图中每个位置的值代表骑士要遭遇的事情。如果是负数,说明此处有怪兽,要让骑士损失血量。如果是非负数,代表此处有血瓶,能让骑士回血。
3)骑士从左上角到右下角的过程中,走到任何一个位置时,血量都不能少于1。为了保证骑土能见到公主,初始血量至少是多少?
根据map,输出初始血量。

 

dp[i][j]   的定义从i,j出发到右下角的血量,那么dp[0][0]就是答案

 

 

dp[n-1][m-1]=Mat.max(1, 1-grid[n-1][m-1])

 

第一行

dp[n-1][j]=Math.max(1,dp[n-1][j+1]-grid[n-1][j])

第一列

dp[i][m-1]=Math.max(dp[i+1][m-1]-grid[i][m-1](

 

 普遍位置怎么填,

dp[i][j]=Math.max(1,Math.min(dp[i+1][j],dp[i][j+1])-grid[i][j])

 

 

import java.util.Scanner;
public class Main{
      public static void main(String[] args) {
        int m,n;
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        int[][] map = new int[n][m];
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0 ; j < m ; j++)
            {
                map[i][j]=sc.nextInt();
            }
        }
        System.out.println(process(map));
        //System.out.println(minHP2(map));
 
    }
    public static int process(int[][] grids){
        int n=grids.length;
        int m=grids[0].length;
        int[][] dp=new int[n][m];
        
        //dp[n-1][m-1] max(1,1-grid[n-1][m-1])
        dp[n-1][m-1]=Math.max(1,1-grids[n-1][m-1]);
           
       // 第一行
       //dp[n-1][j]=dp[n-1][j+1]-grid[n-1][j]
        for(int j=m-2;j>=0;j--){
            dp[n-1][j]=Math.max(1,dp[n-1][j+1]-grids[n-1][j]);
        }
        //第一列
        //dp[i][m-1]=dp[i+1][m-1]-grid[i][m-1]
        for(int i=n-2;i>=0;i--){
            dp[i][m-1]=Math.max(1,dp[i+1][m-1]-grids[i][m-1]);
        }
        //dp[i][j]=Math.max(1,Math.min(dp[i+1][j],dp[i][j+1])-grid[i][j])
        for(int i=n-2;i>=0;i--){
            for(int j=m-2;j>=0;j--){
                dp[i][j]=Math.max(1,Math.min(dp[i+1][j],dp[i][j+1])-grids[i][j]);
            }
            
        }
         return dp[0][0];
    }
}

  

 

posted @ 2021-11-09 23:49  sherry001  阅读(67)  评论(0编辑  收藏  举报