完美世界-2019春招第二道算法题--圣斗士救雅典娜

一、题目介绍:圣斗士救雅典娜

* 题目介绍:完美世界-第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]的更新,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值