成都高级网站建设,comodo ssl wordpress,什么都能看的浏览器,高端私人订制网站建设题目
在一个由数字组成的三角形中#xff0c;第1行有1个数字#xff0c;第2行有2个数字#xff0c;以此类推#xff0c;第n行有n个数字。例如#xff0c;下图是一个包含4行数字的三角形。如果每步只能前往下一行中相邻的数字#xff0c;请计算从三角形顶部到底部的路径经…题目
在一个由数字组成的三角形中第1行有1个数字第2行有2个数字以此类推第n行有n个数字。例如下图是一个包含4行数字的三角形。如果每步只能前往下一行中相邻的数字请计算从三角形顶部到底部的路径经过的数字之和的最小值。从三角形顶部到底部的路径数字之和的最小值为11对应的路径经过的数字用阴影表示。 说明从三角形顶部到底部的路径数字之和的最小值为11对应的路径经过的数字用阴影表示
分析
可以移动三角形每行的位置使它们左端对齐 可以用fij表示从三角形的顶部出发到达行号和列号分别为i和ji≥j的位置时路径数字之和的最小值同时用T[i][j]表示三角形行号和列号分别为i和j的数字。如果三角形中包含n行数字那么fn-1j的最小值就是整个问题的最优解。
解
public class Test {public static void main(String[] args) {ListInteger list1 Arrays.asList(2);ListInteger list2 Arrays.asList(3, 4);ListInteger list3 Arrays.asList(6, 5, 7);ListInteger list4 Arrays.asList(4, 1, 8, 3);ListListInteger triangle Arrays.asList(list1, list2, list3, list4);int result minimumTotal(triangle);System.out.println(result);}public static int minimumTotal(ListListInteger triangle) {int size triangle.size();int[][] dp new int[size][size];for (int i 0; i size; i) {for (int j 0; j i; j) {dp[i][j] triangle.get(i).get(j);if (i 0 j 0) {// 最左边dp[i][j] dp[i - 1][j];}else if (i 0 i j) {// 最右边dp[i][j] dp[i - 1][j - 1];}else if (i 0) {dp[i][j] Math.min(dp[i - 1][j], dp[i - 1][j - 1]);}}}int min Integer.MAX_VALUE;for (int num : dp[size - 1]) {// 答案在最底层选出一个最小的min Math.min(min, num);}return min;}
}