题目:
给定一个二维数组,含义是一张地图,例如,如下矩阵:
int[][] data={{-2,-3,3},
{-5,-10,1},
{0,30,-5}};
游戏规则如下:
1.骑士从左上角出发,每次只能向下或向右走,最后达到右下角见到公主。
2.地图中每个位置代表骑士血量的变化,若为负数,则表示有怪兽掉血;若为整数,则表示有血包,增加了血量;
3. 骑士走到任何一个位置,血量都不能少于1.
为了保证骑士能见到公主,聪明的骑士血量至少是多少?
public void dragonGame(int[][] data)
{
if(data == null)
return;
int rows=data.length;
int cols=data[0].length;
int[][] dp=new int[rows][cols];//dp[i][j]表示到达data[i][j]前应有的最少血量
int row=rows-1;
int col=cols-1;
//见到公主前的血量赋值
dp[row][col]=1;//先赋值为1
if(dp[row][col]+data[row][col] < 1)//若遇到怪兽要掉血
dp[row][col]=1-data[row][col];//则重新赋值为掉的血量+1,这样便可保证最少血量。
//最下行赋值
for(int j=col-1;j>=0;j--)
{
dp[row][j]=dp[row][j+1]-data[row][j];//1.若data[i][j]表示正数,则表示加血过程,减去加的血即可;但若减法过后血量少于1,则赋值为1;
if(dp[row][j] < 1) //2.若data[i][j]表示负数,则表示减血过程,加上该减掉的血即可,即为经过前应有的最少血量;
dp[row][j]=1;
}
//最右列赋值
for(int i=row-1;i>=0;i--)
{
dp[i][col]=dp[i+1][col]-data[i][col];
if(dp[i][col] < 1)
dp[i][col]=1;
}
//一般情况
for(int i=row-1;i>=0;i--)
{
for(int j=col-1;j>=0;j--)
{
dp[i][j]=Math.min(dp[i][j+1],dp[i+1][j])-data[i][j];
if(dp[i][j] < 1)
dp[i][j]=1;
}
}
System.out.println(""+dp[0][0]);
}