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