题目描述:
java代码:
class Solution {
public int minPathSum(int[][] grad) {
for(int i=1;i<grad.length;i++){
grad[i][0]+=grad[i-1][0];// grad[i][0]=grad[i][0]+grad[i-1][0];
//先固定y方向上的值,对x方向上的值进行遍历
}
for(int j=1;j<grad[0].length;j++){
grad[0][j]+=grad[0][j-1];
}
for(int i=1;i<grad.length;i++){
for(int j=1;j<grad[i].length;j++){
grad[i][j]=Math.min(grad[i-1][j],grad[i][j-1]+grad[i][j]);
}
}
return grad[grad.length-1][grad[0].length-1];
}
}
什么是动态规划
就是已知最后一个步骤的解答方法,然后逆着递推,直到求出最初的值。动态规划其实质上是通过开辟记录表,记录已求解过的结果,当再次需要求解的时候,可以直接到那个记录表中去查找,从而避免重复计算子问题来达到降低时间复杂度的效果。实际上是一个空间换时间的算法。动态规划,通常可以把指数级的复杂度降低到多项式级别。一般算法书都会讲能不能用动态规划来求解问题,通常是判断有没有最有解结构,通常是通过“剪切技术”来判断:即证明问题的一个最优解中,使用的子问题的解本身也必须是最优的。通常是假设一个子问题不是最优的,那么找到一个最优的子问题来替换这个子问题,那么产生的最优解将优于已找到的那个最优解。
动态规划,在一步选择的时候,是通过从以前求出的若干个与本步骤相关的子问题最优解中选择最好的那个,加上这一步的值,来构造这一步那个子问题的最优解,而如果以前求出的若干个子问题不保存下来,就需要重新求(通常是递归所致)。动态规划用武之地也无非是保存这些重复的子问题而避免重新求解而达到高效的目的。
参考链接:https://blog.csdn.net/baidu_37107022/article/details/73188963
参考链接:https://www.cnblogs.com/alantu2018/p/8462172.html