动态规划之路劲问题3
解析题目:
跟之前路径题目大概一样,从左上角到右下角,每一步只能向下或者向右,而且每次走出来血量必须大于0(注意这一点,否则容易导致每次出来可能小于0就可能错)
算法分析:
状态表示:经验+题目
以dp[i][j]为结尾,最少的健康点数
dp[i][j]:表示到达这个位置时的最少的健康点数,如果我们以这个表示我们的状态,就会发现有问题,因为这个ij位置的健康点数不仅仅受下一步(也就是往右和往下)的影响,还受后面很多个路径上的点的影响,比如以例题为例:一开始我们如果初始值为3,走完-2还剩1,那我们走不出-3和-5,如果我们初始值为6,走完-2,-3,3,1,但是到-5时变为0,所以初始值为7才是对的,所以我们ij位置不仅仅是受最近的i j-1和i-1 j位置影响,还受多个位置的值影响
这道题难就难在需要走出一个房间的健康数要大于0,证明我们上面的状态行不通
所以还有一种经验+题目
以dp[i][j]位置为起始,到终点的最少的健康点数
状态转移方程:
根据最近的一步
dp[i][j]到达终点需要的最少的健康点数,你要求dp[i][j]到终点是不是要先求到dp[i][j+1]或dp[i+1][j]
因为dp[i][j+1]或dp[i+1][j] 也表示那个位置到终点的最少的健康点数,所以你只要由dp[i][j]到那两个位置的最少的健康点数就行;
所以我们要比较右边和下面的两个健康点数谁最少就取谁,然后在+上我们走出dp[i][j]时所剩余的健康点数,也就是+dungeon[i][[j]
注意:当我们发现求得dp[i][j]小于0,原因在于我们dungeon[i][j]是一个很大的血包,那此时的dp[i][j]只需要1即可,
1+dungeon[i][j]-dp[i][j]>0(图示有错,dp[i][j]想表示的是dungeon[i][j])
初始化:出来要有一滴血保证最少
返回值:dp[0][0] ;