描述:
有一个三角数组,形如:
5
12 6
7 13 18
12 14 10 9
求从最上面元素开始,每一层选择一个元素,每一个元素可以向下选择,
向左斜下方选择,向右斜下方选择,问最终选择出来的数字的最大值是多少?
public class 三角数组求和的最大值 {
public static void main(String[] args) {
int[][] ar = {
{5},
{12,6},
{7,13,18},
{12,14,10,29}
};
int[][] dp = new int[ar.length][ar.length];
int max = func(ar, 0, 0, dp);
System.out.println(max);
System.out.println(number);
/**
* dp[i][j] = max{ar[i][j]+dp[i+1][j],
* ar[i][j] + dp[i+1][j-1], ar[i][j]+dp[i+1][j+1]}
*/
/*int[][] dp = new int[ar.length][ar.length];
int row = ar.length-1;
for (int i = 0; i < ar[row].length; i++) {
dp[row][i] = ar[row][i];
}
for(int i=row-1; i>=0; --i){
for(int j=0; j<ar[i].length; ++j){
int n1 = ar[i][j] + dp[i+1][j];
int n2 = ar[i][j] + dp[i+1][j+1];
int n3=0;
if(j > 0){
n3 = ar[i][j] + dp[i+1][j-1];
}
dp[i][j] = Math.max(Math.max(n1, n2), n3);
}
}
System.out.println(dp[0][0]);*/
}
/**
* 以ar数组中的[i][j]的元素为起始元素,每一行选择一个,最终
* 组成的和的最大值
* @param arr
* @param i
* @param j
*/
static int number = 0;
private static int func(int[][] arr, int i, int j, int[][] dp) {
if(i > arr.length-1 || j < 0 || j > arr[i].length-1){
return 0;
}
if(dp[i][j] > 0){
return dp[i][j];
}
number++;
int n1 = arr[i][j] + func(arr, i+1, j, dp);
int n2 = arr[i][j] + func(arr, i+1, j-1, dp);
int n3 = arr[i][j] + func(arr, i+1, j+1, dp);
dp[i][j] = Math.max(Math.max(n1, n2), n3);
return dp[i][j];
}
}