骑士与地下城游戏
给定一个二维数组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];
}
}

浙公网安备 33010602011771号