数塔,从顶层到底层或从底层到顶层,在每一个结点可以选择向左走或是向右走,要求找出一条路径,使路径上的数值和最大。
输入描述:输入数塔层数n,再逐行从左到右输入数塔中所存数字。
输出描述:输出路径的最大数值和,同时输出所经过的路径。
输入样例
5
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
输出样例
最大数值和为:59
所经过的路径为:9->12->10->18->10
package dynamic_planning;
import java.util.Arrays;
import java.util.Scanner;
public class DpMain {
public static void main(String[] args) {
//输入
int[][] str = inputArray();
//数组复制,为打印路径
int[][] strCopy = new int[str.length][str.length];
for (int i =0;i<str.length;i++)
System.arraycopy(str[i],0,strCopy[i] ,0,str.length );
System.out.println("数组strCopy复制str后:");
for(int i =0;i<str.length;i++)
System.out.println(Arrays.toString(strCopy[i]));
System.out.println("-----------------------------------");
//转换二维数组
int[][] str1 = conversionArray(str);
//输出最大和
System.out.println("最大和为:"+str1[0][0]);
//输出路径
outputPath(str1,strCopy);
}
public static int[][] inputArray(){
int n = 0;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
int[][] str = new int[n][n];
int[][] str1 = new int[n][n];
for (int i =0;i<n;i++){
for (int j= 0;j<=i;j++){
str[i][j] = scanner.nextInt();
}
}
System.out.println("输入后的数组str为:");
for(int i =0;i<str.length;i++)
System.out.println(Arrays.toString(str[i]));
System.out.println("-----------------------------------");
return str;
}
public static int[][] conversionArray(int[][] str){
for (int i=str.length-1;i>=0;i--){
for (int j = i;j>=0;j--){
if (str[i][j]>str[i][j-1]){
str[i-1][j-1]=str[i-1][j-1]+str[i][j];
}else {
str[i-1][j-1]=str[i-1][j-1]+str[i][j-1];
}
//已经算到最左侧
if (j-1 == 0)
break;
}
//已经最顶
if (i-1 == 0)
break;
}
System.out.println("str转换后s为:");
for(int i =0;i<str.length;i++)
System.out.println(Arrays.toString(str[i]));
System.out.println("-----------------------------------");
return str;
}
public static boolean compareTwo(int a,int b ){
if (a>=b)
return true;
else
return false;
}
public static void outputPath(int[][] str1,int[][] str){
int p = 0;
boolean flag;
System.out.print("路径为:");
for (int i=0;i<str1.length;i++){
flag=compareTwo(str1[i][p],str1[i][p+1]);
if (flag){
//当输出到最后一个值时改变输出形式;
if (i+1!= str1.length)
System.out.print("["+str[i][p]+"]"+"——>");
else
System.out.print("["+str[i][p]+"]");
}
else {
if (i+1!= str1.length)
System.out.print("["+str[i][p+1]+"]"+"——>");
else
System.out.print("["+str[i][p+1]+"]");
p++;
}
}
}
}
// 5
// 9
// 12 15
// 10 6 8
// 2 18 9 5
// 19 7 10 4 16