数字三角形

来源:互联网 发布:知乎 扒皮 编辑:程序博客网 时间:2024/06/15 08:38
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
 注意事项
如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总行数。
您在真实的面试中是否遇到过这个题? Yes
样例
比如,给出下列数字三角形:
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。


import java.util.Scanner;/** * 给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。 注意事项如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总行数。您在真实的面试中是否遇到过这个题? Yes样例比如,给出下列数字三角形:[     [2],    [3,4],   [6,5,7],  [4,1,8,3]]从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。 *  * @author Dell * */public class Test109 {      public static int minimumTotal(int[][] triangle)      {      int m=triangle.length;      int min=Integer.MAX_VALUE;      int[][] dp=new int[m][m];      dp[0][0]=triangle[0][0];        for(int i=1;i<m;i++)      {     for(int j=0;j<=i;j++)     {    if(j==0)    dp[i][j]=dp[i-1][j]+triangle[i][j];    else if(j==i)     dp[i][j]=dp[i-1][j-1]+triangle[i][j];    else    {    dp[i][j]=Math.min(dp[i-1][j-1], dp[i-1][j])+triangle[i][j];    }              }      }     for(int i=0;i<m;i++)     {     if(dp[m-1][i]<min)     {    min=dp[m-1][i];     }     }    return min;          }public static void main(String[] args) {    Scanner sc=new Scanner(System.in);    int n=sc.nextInt();int[][] triangle=new int[n][];        for(int i=0;i<n;i++)        {        triangle[i]=new int[i+1];        for(int j=0;j<i+1;j++)        {        triangle[i][j]=sc.nextInt();        }        }   System.out.println(minimumTotal(triangle));    }}