作者:小迅
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
![](https://i-blog.csdnimg.cn/blog_migrate/cb2e7361c5553022c0c21254330a4ecb.png)
思路
题意 -> 在给定二维数组中,取最大值路径,并返回最大值
对于最值问题 -> 优先使用动态规划 -> 对于动态规划的题目也可以使用递归
因此本题存在两种方法:
动态规划:
含义:dp[i][j] 表示的含义为 (i,j) 坐标的最大值
初始化:那么对于 (0,0)位置,dp[0][0] = grid[0][0]。
递推公式:那么动态规划递推公式怎么表示呢? 当前位置的大小,取决于从那一步过来,因此每次选择上一步时选择最大值即可 -> dp[i][j] += MAX(dp[i-1][j], dp[i][j-1]);
递推方向:由于当前位置的大小取决于上一次的大小情况,所以需要从头开始递推
由于 dp[i][j] 的 状态只由 dp[i-1][j], dp[i][j-1] 影响,因此可以只申请两个变量保存上一次的状态,当然也可以使用grid数组代替dp数组。
递归:
递归其实和动态规划差不多,每次枚举当前位置的时候,选择上一步的最大值,从第一个位置开始递归即可
代码
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int maxValue(int** grid, int gridSize, int* gridColSize){
int max = grid[0][0];
for (int j = 1; j < gridColSize[0]; ++j) {//递推第一行
grid[0][j] += grid[0][j-1];//记录当前位置最大值
max = MAX(max, grid[0][j]);//保存最大值
}
for (int i = 1; i < gridSize; ++i) {//递推第一列
grid[i][0] += grid[i-1][0];//记录当前位置最大值
max = MAX(max, grid[i][0]);//保存最大值
}
for (int i = 1; i < gridSize; ++i) {//递归取余位置
for (int j = 1; j < gridColSize[0]; ++j) {
grid[i][j] += MAX(grid[i-1][j], grid[i][j-1]);//记录当前位置最大值
max = MAX(max, grid[i][j]);//保存最大值
}
}
return max;
}
作者:小迅
链接:https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/solutions/2154458/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-snbm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。