题目描述:
Given a triangle, find the minimum path sum from top to bottom.
Each step you may move to adjacent numbers on the row below.(给定一个三角形,从上到下找到最短路径的总和。每一步,你要移到下一行与该数相邻的数。)
For example, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
public class Triangle {
public static ArrayList<int[]> Triangle=new ArrayList<int[]>();
//计算出每个出口的最小值在里面找到最小的值
public static void solve()
{
Triangle.get(0)[0]=Triangle.get(0)[0];
for(int i=1;i<Triangle.size();i++)
{
for(int j=0;j<Triangle.get(i).length;j++)
{
//对两个边界值的处理如果在最左边那么只能从上一行的最左边的节点到达
//所以只需要加上上一行最左边节点的路径值就可以
if(j==0)
{
Triangle.get(i)[j]+=Triangle.get(i-1)[j];
}
else
{
//最右边的值同上解释
if(j==Triangle.get(i).length-1)
{
Triangle.get(i)[j]+=Triangle.get(i-1)[j-1];
}
//如果在中间的话到达该点只有两条路,从这两条路里挑选最短
//并加上该点的值
else
{
Triangle.get(i)[j]+=Math.min(Triangle.get(i-1)[j-1],Triangle.get(i-1)[j]);
}
}
}
}
//找到到达最后一行(出口)的值,从这些出口值中选出最小值即可。
Arrays.sort(Triangle.get(Triangle.size()-1));
System.out.println(Triangle.get(Triangle.size()-1)[0]);
}
public static void main(String[] args) {
//对Triangle进行一个输入
Scanner sc=new Scanner(System.in);
int n1=sc.nextInt();
for(int i=0;i<n1;i++)
{
int n2=sc.nextInt();
int array[]=new int[n2];
for(int j=0;j<n2;j++)
{
array[j]=sc.nextInt();
}
Triangle.add(array);
}
solve();
}
}