迷宫
题目:
输入样例:
3 1 1 1 2 3 4 5 6 7 8 9 2 2 1 3 1 R
输出样例:
21
思路:
题目大意:给定一个n x m
的平面网格,并且每一个格子都有一定的代价,并且设有障碍物和陷阱,障碍物的意思是会在原来对应格子的基础上在加上一定的代价,陷阱的意思是如果移动到某一位置有陷阱存在,那么会自动在向右或下移动两个格子。要求从(0, 0)
位置开始进行移动,移动到(n, m)
结束,每次移动只能选择向下或者向右移动。求移动到终点时最小的代价是什么。
看到题目的数据范围 0 < n,m < 1001就知道,这道题不能使用纯暴力的方法进行求解n * m大概在 1 0 6 10^6 106左右,如果时间复杂度在 O ( N 2 ) O(N^2) O(N2)或者 O ( N log N ) O(N\log N) O(NlogN)就可能过不了全部数据。
这道题与力扣上的不同路径II问题十分相似,只是不同路径II问题求的是有多少不同路径的可能性,这道题是求最小的代价是什么,另一点不同的是这道题设定的障碍物与陷阱,而不同路径问题仅仅只设定了障碍物,并且要求有障碍物的位置不能通过(友情链接:不同路径 II)
整体思路:使用动态规划的思想,在处理输入数据的时候,将障碍物的部分的代价直接累加到原数组上去,并且开辟一个新的字符数组,用来记录那个地方有陷阱。
初始化边界:
将
dp[0][0]
初始化为第一个格子的代价,然后第一行其它位置的dp
值等于前一个位置的dp
值加上该位置的代价值,第一列其它位置的dp
值等于上面一个位置的dp
值加上当前位置的代价值。代码如下:
for(int i = 1;i <= n;i ++) dp[i][1] = dp[i - 1][1] + nums[i][1]; for(int j = 1;j <= m;j ++) dp[1][j] = dp[1