package com.algorithm.dynamicprogramming;
/**
* 算法描述:找到金字塔最小路径和
* @author rich
*
*/
public class MinimumPathRectangle {
public static void main(String[] args) {
int[][] triangle = new int[][] { { 1, 3, 10 }, { 1, 5, 1 }, { 4, 2, 1 } };
System.out.println(move(triangle));
// System.out.println(move2(triangle));
}
/**
* 算法分析: 第一层只能向右走, 第一列只能往下走 从第二层开始走, 当 i=0 时,memo[i][j] = triangle[i][j] +
* memo[i][j-1] 当 j=0 时,memo[i][j] = triangle[i][j] + memo[i-1[j] 其它 memo[i][j]
* = min(triangle[i][j] + memo[i][j-1],triangle[i][j] + memo[i-1][j])
* 最后memo[n-1][n-1]为最终值 算法复杂度O(n^2)
*
* @param triangle
* @return
*/
public static int move(int[][] triangle) {
int n = triangle.length;
int[][] memo = new int[n][triangle[0].length];
// 初始化
for (int i = 0; i < triangle.length; i++) {
for (int j = 0; j < triangle[i].length; j++) {
if (i == 0 && j == 0) {
memo[i][j] = triangle[i][j];
} else if (i == 0) {
memo[i][j] = triangle[i][j] + memo[i][j - 1];
} else if (j == 0) {
memo[i][j] = triangle[i][j] + memo[i - 1][j];
} else {
memo[i][j] = Math.min(triangle[i][j] + memo[i][j - 1], triangle[i][j] + memo[i - 1][j]);
}
}
}
return memo[n - 1][n - 1];
}
/**
* 算法分析:从倒数第二层往上找,每一层得到 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 m = triangle.length;
int n = triangle[0].length;
int[] memo = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int tmp = 0;
if ((i - 1 >= 0) && (j - 1 >= 0))
tmp = Math.min(memo[j], memo[j - 1]);
else if (i - 1 >= 0)
tmp = memo[j];
else if (j - 1 >= 0)
tmp = memo[j - 1];
else
tmp = 0;
memo[j] = tmp + triangle[i][j];
}
}
return memo[n - 1];
}
}