Minimum Path Sum
2016-07-27 15:07
435 查看
一个矩阵,从左下角开始走,走到右上角经过节点和最小的路径
例如:
1, 2, 3, 1
1, 2, 1, 4
1, 1, 1, 4
1, 2, 3, 4
结果是9,up -> right -> right -> up -> right
递归法
int grid[4][4]这样的二维数组代表每个节点的值,从grid[0][0]走到grid[3][3],如果走到grid[3][3]可以看做是走到grid[2][3]的最小路径+1,或者是走到grid[3][2]的最小路径+1,分别对应最后一步是向右走还是向上走。
需要注意两点:
1. 递归终止条件是走到grid[0][0]
2. 如果已经走到边界,就不递归了
以上的代码会重复求解子问题,可以通过用一个数组保存子问题的接,也就是minPathSum(p, q)的解
动态规划
例如:
1, 2, 3, 1
1, 2, 1, 4
1, 1, 1, 4
1, 2, 3, 4
结果是9,up -> right -> right -> up -> right
递归法
int grid[4][4]这样的二维数组代表每个节点的值,从grid[0][0]走到grid[3][3],如果走到grid[3][3]可以看做是走到grid[2][3]的最小路径+1,或者是走到grid[3][2]的最小路径+1,分别对应最后一步是向右走还是向上走。
public int minPathSum(int[][] grid, int p, int q) { if (p == 0 && q == 0) { return grid[p][q]; } int up = Integer.MAX_VALUE,right = Integer.MAX_VALUE; if (p-1 >= 0) { up = minPathSum(grid, p - 1, q) + grid[p][q]; } if (q-1 >= 0) { right = minPathSum(grid, p, q - 1) + grid[p][q]; } return Math.min(up, right); } @Test public void sumTest() { int[][] grid = new int[4][]; // result 9 -> up -> right -> right -> up -> right grid[3] = new int[]{1, 2, 3, 1}; grid[2] = new int[]{1, 2, 1, 4}; grid[1] = new int[]{1, 1, 1, 4}; grid[0] = new int[]{1, 2, 3, 4}; System.out.println(minPathSum(grid, 3, 3)); }
需要注意两点:
1. 递归终止条件是走到grid[0][0]
2. 如果已经走到边界,就不递归了
以上的代码会重复求解子问题,可以通过用一个数组保存子问题的接,也就是minPathSum(p, q)的解
动态规划
public int minPathSum(int[][] grid, int row, int col) { int[][] res = new int[row][row]; for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { if (i==0 && j==0) { res[i][j] = grid[i][j]; } else if (i-1 < 0) { res[i][j] = grid[i][j] + res[i][j - 1]; } else if (j-1 < 0) { res[i][j] = grid[i][j] + res[i - 1][j]; } else { res[i][j] = grid[i][j] + Math.min(res[i - 1][j], res[i][j - 1]); } } } return res[row - 1][row - 1]; } @Test public void sumTest() { int[][] grid = new int[4][]; // result 9 -> up -> right -> right -> up -> right grid[3] = new int[]{1, 2, 3, 1}; grid[2] = new int[]{1, 2, 1, 4}; grid[1] = new int[]{1, 1, 1, 4}; grid[0] = new int[]{1, 2, 3, 4}; System.out.println(minPathSum(grid, 4, 4)); }
相关文章推荐
- WCF配置详解
- python学习笔记2(对象)
- RX操作符之Observable的创建方式二(defer、range、interval、timer、Empty、Never、Throw)
- Ubuntu 14.04 文件服务器--samba的安装和配置
- AngularJS中如何使用trigger报错$digest already in progress
- Glide的使用(加载图片,动态图,缩略图,视频解码等)
- freeSSHd开启ssh出错
- 如何在生产环境删除百万级以上的数据
- String类中类型的区分
- 手机端(android与ios)黑客安全检测工具锦集
- Android应用层View绘制流程与源码分析
- Java:按值传递还是按引用传递详细解说
- MySQL 学习总结-聚合函数总结
- HDU 1531 King (差分约束)
- Java-交通管理灯系统项目
- 带有粘性动画的PageControl
- FZU 1852 Impossible Mission II floyd+TSP
- 【POJ】1573 & 【HDU】1035 - Robot Motion(模拟)
- javascript常用系统对象用法
- viewpager轮播图片设置OntounchListener