package com.algorithm.dynamicprogramming;
/**
* 算法描述:找到金字塔最小路径和
* @author rich
*
*/
public class MinimumPathTriangle {
public static void main(String[] args) {
int[][] triangle = new int[][] {
{2},
{3,4},
{6,5,7},
{4,1,8,3}
};
System.out.println(move(triangle));
System.out.println(move2(triangle));
}
/**
* 算法分析:从倒数第二层往上找,每一层得到
* memo[i][j] = min(triangle[i][j]+memo[i+1][j],triangle[i][j]+memo[i+1][j+1]),
* 最后memo[0][0]为最终值
* 算法复杂度O(n^2)
* @param triangle
* @return
*/
public static int move(int[][] triangle) {
int n = triangle.length;
int[][] memo = new int[n][n];
// 初始化
for (int i = 0;i<n;i++) {
memo[n-1][i] = triangle[n-1][i];
}
for (int i = n-2;i>=0;i--) {
for (int j = 0;j<triangle[i].length;j++) {
memo[i][j] = Math.min(triangle[i][j]+memo[i+1][j],triangle[i][j]+memo[i+1][j+1]);
}
}
return memo[0][0];
}
/**
* 算法分析:从倒数第二层往上找,每一层得到
* memo[i] = min(triangle[i][j]+memo[i],triangle[i][j]+memo[i+1]),
* 最后memo[0]为最终值
* 算法复杂度O(n)
* @param triangle
* @return
*/
public static int move2(int[][] triangle) {
int n = triangle.length;
int[] memo = new int[n];
// 初始化
for (int i = 0;i<n;i++) {
memo[i] = triangle[n-1][i];
}
for (int i = n-2;i>=0;i--) {
for (int j = 0;j<triangle[i].length;j++) {
memo[j] = Math.min(triangle[i][j]+memo[j],triangle[i][j]+memo[j+1]);
}
}
return memo[0];
}
}
动态规划-金字塔最短路径
最新推荐文章于 2022-06-10 11:08:35 发布