试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字总和最大。例如,上述数字三角形的最优解30﹐自顶向下的路径为7-3-8-7-5。
数据输入:
由文件input.txt提供输入数据。文件的第1行是数字三角形的行数,该数字在1到100之间。接下来n行是数字三角形各行中的数字。所有数字在0至99之间。
输出:
import java.util.Scanner;
public class DigitalTriangle {
public static void main(String[]args){
int nums; // 设置行数
Scanner input =new Scanner(System.in);
System.out.println("输入数字三角的的行数");
nums=input.nextInt();
int[][]intput=new int[nums][nums];
System.out.println("输入数字三角内的数字");
for (int i=0;i<nums;i++){
for (int j=0;j<=i;j++){
intput[i][j]= input.nextInt();
}
}
int [][]sum=new int[nums-1][nums-1];
for (int i=0;i<nums-2;i++){
if ((intput[nums-2][i]+intput[nums-1][i])>(intput[nums-2][i]+intput[nums-1][i+1])){
sum[nums-2][i]=intput[nums-2][i]+intput[nums-1][i];
}
else {
sum[nums-2][i]=intput[nums-2][i]+intput[nums-1][i+1];
}
}
for (int i=nums-3;i>=0;i--){
for (int j=0;j<=i;j++){
if ((intput[i][j]+sum[i+1][j])>(intput[i][j]+sum[i+1][j+1])){
sum[i][j]=intput[i][j]+sum[i+1][j];
}
else {
sum[i][j]=intput[i][j]+sum[i+1][j+1];
}
if (i==0){
System.out.println("输出的最大值为:");
System.out.println(sum[i][j]);
}
}
}
int []order=new int[nums];
order[0]=intput[0][0];
for (int m=0,i=1;i<nums;i++){
if (i<=nums-2){
if (sum[i][m]>sum[i][m+1]){
order[i]=intput[i][m];
}
else{
order[i]=intput[i][m+1];
m++;
}
}
else{
if (intput[i][m]>intput[i][m+1]){
order[i]=intput[i][m];
}
else{
order[i]=intput[i][m+1];
m++;
}
}
}
System.out.print("程序的顺序为:");
for (int i=0;i<nums;i++){
if (i<nums-1){
System.out.print(order[i]+"->");
}
else{
System.out.print(order[i]);
}
}
}
}