动态规划——最短路径问题
作者:不如打代码KK
关键词:二维矩阵,最短路径,动态规划
动态规划——最短路径问题
1.动态规划概念和思想
动态规划过程是:把原问题划分成多个“阶段”,依次来做“决策”,得到当前的局部解;每次决策,会依赖于当前“状态”,而且会随即引起状态的转移。
这样,一个决策序列就是在变化的状态中,“动态”产生出来的,这种多阶段的、最优化决策,解决问题的过程就称为动态规划(Dynamic Programming,DP)。
基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一个子问题的解,会为后一子问题的求解,提供有用的信息。
在求解一个子问题的时候,我们会列出、所有可能的局部解,通过“决策”,保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决每个子问题,最后一个子问题,也就是最后一个阶段的问题,那就是初始问题的解。
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。
动态规划通常用来求解最优化问题。
这类问题可以有很多可行解,每个解都对应一个值,我们希望找到具有最优值(最大或最小)的解。
2.问题描述
给定一个包含非负整数的 m x n 举证matrix,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
3.代码实现
如有问题请评论,看到后会帮忙解答。
@Test
public void test11() {
int[][] matrix = new int[][]{
{0, 3, 1, 8, 1},
{1, 1, 8, 0, 1},
{0, 5, 1, 9, 1},
{8, 2, 1, 4, 1},
{0, 1, 1, 0, 1}};
Assert.assertTrue(getMinPathSum(matrix) == 10);
}
public int getMinPathSum(int[][] matrix) {
int r = matrix.length;
int l = matrix[0].length;
int[][] dp = new int[r][l];
dp[0][0] = matrix[0][0];
//第一行
for (int i = 1; i < l; i++) {
dp[0][i] = dp[0][i-1] + matrix[0][i];
}
//第一列
for (int i = 1; i < r; i++) {
dp[i][0] = dp[i-1][0] + matrix[i][0];
}
//遍历每一个元素
for (int i = 1; i < r; i++) {
for (int j = 1; j < l; j++) {
int temp1 = dp[i-1][j]+matrix[i][j];
int temp2 = dp[i][j-1]+matrix[i][j];
dp[i][j]= temp1 < temp2 ? temp1 : temp2;
}
}
return dp[r-1][l-1];
}