1.坐标形动态规划
相关图形(三角形),代码在二维矩阵中,往下走,往右走。
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
如:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
public static int minimumTotal(int[][] triangle) { if (triangle == null || triangle.length == 0) { //行不为0 return -1; } if (triangle[0] == null || triangle[0].length == 0) { //列不为0 return -1; } int n = triangle.length; int [][] f = new int[n][n]; //初始化 起点 f[0][0] = triangle[0][0]; //初始化三角形的左边和右边 for (int i = 1; i < n ;i++) { f[i][0] = f[i - 1][0] + triangle[i][0]; f[i][i] = f[i-1][i-1] + triangle[i][i]; } //自上而下初始化三角形中间重复计算的部分(筛选出最小值) for (int i = 1; i < n; i++) { for (int j = 1; j < i; j++) { f[i][j] = Math.min(f[i-1][j],f[i-1][j-1]) + triangle[i][j]; System.out.printf("i = %d,j = %d,value = %d ",i,j,f[i][j]); } } //answer终点(求出最小值) int best = f[n-1][0]; for (int i = 1; i < n; i++) { best = Math.min(best,f[n-1][i]); } return best; }