一、题目介绍:圣斗士救雅典娜
* 题目介绍:完美世界-第2道算法题目
* 黄金圣斗士欧洛斯要去圣域救雅典娜,需要从左上角出发,每次只能向右或向下走,最后达到右下角见到雅典娜。
* 地图的每个位置的值代表圣斗士要遭遇的事情,如果是负数,说明此处有阻击,要让圣斗士损失血量,如果是非负数,
* 代表次数有血瓶,能让圣斗士回血。圣斗士从左上角走到右下角的过程中,走到任何一个位置时,血量都不少于1,
* 为了保证圣斗士能救出雅典娜,初始血量至少是多少?地图为一个二维数组map,如下矩阵。根据map,返回初始血量。
* -2 -3 3
* -5 -10 1
* 0 30 -5
* 初始血量至少为7。
* 输入描述:一个n*m的二维数组。第一行:数组的行数n(n>0);第二行:数组的列数m(m>0);
* 第三行:数组,每个位置的血量,行优先。
* 输出描述:对于每个测试实例,要求输出初始血量。
* 示例:
* 输入:
* 3
* 3
* -2 -3 3 -5 -10 1 0 30 -5
* 输出:
* 7注释:这里简化了控制台输入的部分。
二、思路分析
* 思路分析:
* 圣斗士是从左上角往右下角走,保证每一个位置(包括终点右下角)的血量都至少为1。
* 欲求起始的最少血量,因此需要逆着推,从终点向起始点推导,且保证每个位置的血量至少为1。
* 方法1:动态规划方法。
* S1: 首先初始化:dp[rows - 1][cols - 1]、最后一列和最后一行。
* dp[rows-1][j]=max{(dp[rows-1][j+1]-blood[i][j]),1};
* dp[i][cols-1]=max{dp[i+1][cols-1]-blood[i][cols-1],1};
* S2:计算其他位置
* dp[i][j] = max{(min{dp[i][j+1],dp[i+1][j]}-blood[i][j]),1};
* 最后返回dp[0][0]即可。
* 注释:max{1,x}的目的是保证到达该位置之前血量至少为1。
* 方法2:递归方法。
* 仍然利用dp数组保存到达该位置前需要的至少血量。
* 递归方法:完成dp[i][j]的更新,