13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路
径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。(每一步可沿直线向下或右斜线向下走,例如,13,8,26,15,24)
/*
输入:
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
*/
static int[][] iarr;
static int[][] p;
public static void main(String[] args) {
// TODO Auto-generated method stub
iarr = new int[5][5];
Scanner scanner = new Scanner(System.in);
String string="";
int i=0;
for(int k=0;k<5;k++)
{
string=scanner.nextLine();
String[] sarr=string.split(" ");
for(int j=0;j<sarr.length;j++)
{
iarr[i][j] = Integer.parseInt(sarr[j]);
}
i++;
}
cal();
}
static void cal()
{
int[][] v = new int[iarr.length][iarr[0].length];
p = new int[iarr.length][iarr[0].length];
v[0][0]=iarr[0][0];
for(int i=1;i<iarr.length;i++)
{
for(int j=0;j<iarr[0].length;j++)
{
if(j==0)
{
v[i][j] = v[i-1][j]+iarr[i][j];
p[i][j]=1;
}
else if(v[i-1][j]>v[i-1][j-1]) {
v[i][j]=v[i-1][j]+iarr[i][j];
p[i][j]=1;
}else if(v[i-1][j-1]>v[i-1][j]) {
v[i][j]=v[i-1][j-1]+iarr[i][j];
p[i][j]=2;
}
}
}
for(int[] i:v)
{
for(int j:i)
{
System.out.printf("%2d ",j);
}
System.out.println();
}
int max=0;
int n=0;
for(int j=0;j<iarr[0].length;j++)
{
if(max<v[iarr.length-1][j])
{
max=v[iarr.length-1][j];
n=j;
}
}
System.out.println("最佳路径和:"+max);
System.out.print("最佳路径:");
get(iarr.length-1, n);
System.out.print(iarr[iarr.length-1][n]);
}
static void get(int i,int j)
{
if(i==0)
{
return;
}
if(p[i][j]==1)
{
get(i-1, j);
System.out.print(iarr[i-1][j]+" ");
}
if(p[i][j]==2)
{
get(i-1, j-1);
System.out.print(iarr[i-1][j-1]+" ");
}
}