【题目】

  给定一个二维数组map,含义是一张地图,例如如下,矩阵:
  -2  -3  3
  -5 -10 1
  0  30 -5
  游戏规则如下:

  • 骑士从左上角出发,每次只能向右或者向下走,最后到达右下角见到公主。
  • 地图中每个位置的只代表骑士要遭遇的事。如果是负数,表示此处有怪兽,要让骑士损失血量。如果是非负数,表示此处有血瓶,能让骑士回血。
  • 骑士从左上角到右下角的过程,走到任何一个位置,血量都不能少于1。

为了保证骑士能顺利见到公主,初始血量至少是多少?根据map,返回初始血量。

【基本思路】

  首先生成和map一样大的矩阵dp,dp[i][j]表示如果骑士要走上位置(i,j),并且从该位置选择一条最优的路径,所需要的血量最少是多少。本题相当于是求dp[0][0]的值,所以,采用倒着填表的方式便可以得到最终结果。dp[i][j]的计算方式如下:

  1. 矩阵的右下角的位置是骑士到达的最后位置,骑士经过这里的时候只要血量不少于1即可,如果该位置是血瓶,即map[2][2] >= 0,则dp[2][2] == 1即可,否则dp[2][2] == -map[2][2] + 1。

  2. 矩阵的最后一列,表示骑士只能向下走,所以此时只要满足在当前位置(i,col-1) (col表示矩阵的列数)加上血或者扣完血之后的血量等于dp[i+1][col-1]即可。

  3. 矩阵的最后一行,表示骑士只能向右走,只要满足在当前位置(row-1,j)(row表示矩阵的行数)加上血或者扣完血之后的血量等于dp[row-1][j+1] 即可。

  4. 骑士在矩阵的其他位置,都有向右或者向下两种选择,只要选择需要血量最少的一个即可。

下面是使用python3.5实现的代码

#龙与地下城游戏问题
#经典动态规划方法
def minHP1(mat):if mat == None or mat[0] == None or len(mat) == 0 or len(mat[0]) == 0:return 1row = len(mat)col = len(mat[0])dp = [[0 for i in range(col)] for j in range(row)]dp[row-1][col-1] = max(-mat[row-1][col-1]+1, 1)for i in range(row-2, -1, -1):dp[i][col-1] = max(dp[i+1][col-1] - mat[i][col-1], 1)for j in range(col-2, -1, -1):dp[row-1][j] = max(dp[row-1][j+1] - mat[row-1][j], 1)for i in range(row-2, -1, -1):for j in range(col-2, -1, -1):right = max(dp[i][j+1] - mat[i][j], 1)down = max(dp[i+1][j] - mat[i][j], 1)dp[i][j] = min(right, down)return dp[0][0]#动态规划+空间压缩
def minHP2(mat):if mat == None or mat[0] == None or len(mat[0]) == 0 or len(mat) == 0:return 1more = len(mat) if len(mat) >= len(mat[0]) else len(mat[0])less = len(mat) if len(mat) < len(mat[0]) else len(mat[0])rowmore = True if more == len(mat) else Falsedp = [0 for i in range(less)]dp[-1] = max(-mat[more-1][less-1]+1, 1)for j in range(less-2, -1, -1):row = more-1 if rowmore else jcol = j if rowmore else more-1dp[j] = max(dp[j+1] - mat[row][col], 1)for i in range(more-2, -1, -1):row = i if rowmore else less-1col = less-1 if rowmore else idp[-1] = max(dp[-1] - mat[row][col], 1)for j in range(less-2, -1, -1):row = i if rowmore else jcol = j if rowmore else iright = max(dp[j+1] - mat[row][col], 1)down = max(dp[j] - mat[row][col], 1)dp[j] = min(right, down)return dp[0]

递归与动态规划---龙与地下城游戏问题相关推荐

  1. 【中等】龙与地下城游戏问题-Java:经典动态规划解法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...

  2. 【中等】龙与地下城游戏问题-Java:经典动态规划结合空间压缩解法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...

  3. 动态规划C++实现--龙与地下城游戏

    题目:龙与地下城游戏 给定一个二维数组map,含义是一张地图,例如,如下矩阵: -2   -3    1 -5  -10   1 0    30  -5 游戏的规则如下: 骑士从左上角出发,每次只能向 ...

  4. 【牛客网动态规划专项】DP12 龙与地下城游戏问题

    题目描述 解题思路 备忘录 dp是一个与map相同大小的矩阵: dp[i][j]:从map[i][j]出发走到map[n-1][m-1](终点)所需的最少初始血量 原问题解:dp[0][0] 状态转移 ...

  5. DP12 龙与地下城游戏问题

    思路:dp[i][j]表示到达(i,j)处应该有的最少血量. 我们要求的是初始血量的最小值,那么倒着求,到达(n,m),dp[n][m]=1-a[n][m]; 到达dp[i][j]=max(min(d ...

  6. 牛客网. 龙与地下城游戏

    题目概述 解题思路 这道题看上去要用动态规划处理.动归的一个关键在于构造最优子问题(也就是写递推公式).对于这种矩阵形式的动态规划,另一个关键(也是我之前选择性忽略的)就是确定动态规划的方向(其实是在 ...

  7. 牛客网:龙与地下城游戏

    这题是走迷宫的升级版本吧. 我们反着从终点走到起点,设dp[i][j]代表从(i,j)走到终点的最少血量.mp表示迷宫里面的值. 我们要知道dp[i][j]和右边下边的mp,dp的关系. 思路如下: ...

  8. leetcode174. 地下城游戏(java)

    地下城游戏 leetcode174. 地下城游戏 题目描述 动态规划 解题思路 代码 动态规划专题 leetcode174. 地下城游戏 来源:力扣(LeetCode) 链接:https://leet ...

  9. LeetCode--174.地下城游戏(动态规划)

    地下城游戏(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题是64.最小路径和的进阶版.但是这一题我们不能从左上向右下的顺序,而是**要 ...

最新文章

  1. Linux内核分析 - 网络[六]:网桥
  2. git修改文件权限方式
  3. hdu 4614 Vases and Flowers
  4. k8s示例:RS和Deployment
  5. oracle linux6 u盘安装,U盘安装RHEL6
  6. SpringBoot2.x 整合websocket 消息推送,单独发送信息,群发信息
  7. Step by Step-构建自己的ORM系列-索引
  8. 零基础自学python-零基础如何自学python?
  9. 基于matlab的锁相环频率合成器,基于simulink的电荷泵锁相环频率合成器建模与仿真.pdf...
  10. 教了一年少儿编程,说说感想和体验
  11. 币骏言:6.14币圈交易市场成功的人有哪些心态和技巧?
  12. 嵌入式平台WIFI AP模式测试
  13. SAP AFS Arun 增强 出口 介绍
  14. booting from hard disk
  15. MySQL创建用户,授权
  16. 视频编解码标准情况概述
  17. intersect的用法
  18. dha哪里提取的好_孕妇吃什么dha好 藻油提取的DHA最适合
  19. CNN的卷积核是单层的还是多层的?
  20. 云产品--游戏加速云产品(已过期)

热门文章

  1. 一个精美的跳动小球—手把手教你用贝塞尔曲线实现一个酷炫跳动动画。
  2. 沙箱安全机制与Native
  3. Pycharm那些隐藏的实用小技巧
  4. 最小二乘法-回归实操
  5. 网络安全工程师的学习路线
  6. window下Anaconda安装tensorflow、keras
  7. 【有利可图网】PS实战系列:学会了这个调色小技巧,你也能点石成金
  8. jvm与Tomcat调优【详解】——有这一篇就够了
  9. wms仓库管理流程的基本作业
  10. zynq7000创建fsbl启动_ZYNQ7000 uboot实现两级引导及加载FPGA程序