数塔问题:从数塔顶层出发,每一个数字可以向左或者向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。如下图:
解决思路如下:
- 利用动态规划自底向上的方法从最底层开始比较。比较方法如第四层为:2+max(4,5)、7+max(5,2)、4+max(2,6)、4+max(6,5)
- 存储结构为下三角的矩阵,用数组array来存储。并用一个数组max来存储每一步规划的最大值
- 规划函数为:
max[ n-1 ][ j ]=array[ n-1 ][ j ] ( 0<=j<=n-1 )
max[ i ][ j ]=array[ i ][ j ]+max{ max[ i+1 ][ j ],max[ i+1 ][ j+1 ] } ( 0<=i<=n-2 ,0<=j<=i)
程序代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
int n;
Scanner in=new Scanner(System.in);
n=in.nextInt();
int[][] array=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
array[i][j]=in.nextInt();
}
}
int max=f(array);
System.out.println(max);
}
public static int f(int[][] array){
int[][] max=array;
int n=max.length;
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
if(max[i+1][j]>max[i+1][j+1]){
max[i][j]=array[i][j]+max[i+1][j];
}
else{
max[i][j]=array[i][j]+max[i+1][j+1];
}
}
}
return max[0][0];
}
}