**给定一个三角形,找出自顶向下的最小路径和。**每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
二维的动态规划代码
class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n=triangle.size(),m=triangle.get(n-1).size();int[][] dp=new int[n][m];//存储到当前节点的最小路径总和for(int i=0;i<n;i++)Arrays.fill(dp[i],Integer.MAX_VALUE);dp[0][0]=triangle.get(0).get(0);for(int i=1;i<n;i++)for(int j=0;j<triangle.get(i).size();j++){if(j==0) dp[i][j]=dp[i-1][j]+triangle.get(i).get(j);//最左边的元素只能从上面的格子下来else dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j);//从左上或者正上下来}int res=Integer.MAX_VALUE;for(int j=0;j<m;j++) res= Math.min(res,dp[n-1][j]);return res;}
}
一维的动态规划代码
class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n=triangle.size();int[] dp=new int[n+1];for (int i=n-1;i>=0;i--)//从下往上for (int j=0;j<=i;j++)dp[j]=Math.min(dp[j+1],dp[j])+triangle.get(i).get(j);return dp[0];}
}