POJ1163三角形

import java.util.Scanner;

/*输入格式:
5 //表示三角形的行数 接下来输入三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,
使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。
只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99
要求输出最大和
*/public class POJ1163 {
static int row;
static int[][] D;
static int[][] memoryD;
static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {
    row = scanner.nextInt();
    D = new int[row][row];
    memoryD = new int[row][row];
    for (int i = 0; i < row; i++) {
        for (int j = 0; j <= i; j++) {
            D[i][j] = scanner.nextInt();
        }
    }
    row--;
    int sum = maxSum(0, 0);
    // System.out.println(sum);
    int sum2 = maxSumDp(0, 0);
    // System.out.println(sum2);
    int sum3 = maxSum3(D);
    System.err.println(sum3);
}

// 递推
private static int maxSum3(int[][] D) {
    for (int i = D.length - 1; i > 0; i--) {
        for (int j = 0; j < i; j++) {
            D[i - 1][j] = max(D[i][j], D[i][j + 1]) + D[i - 1][j];
        }
    }
    return D[0][0];
}

// 递归
private static int maxSum(int i, int j) {
    return i == row ? D[i][j] : max(maxSum(i + 1, j), maxSum(i + 1, j + 1)) + D[i][j];
}

// 递归+DP
private static int maxSumDp(int i, int j) {
    if (i == row)
        return D[i][j];
    if (memoryD[i][j] != 0)
        return memoryD[i][j] + D[i][j];
    else {
        memoryD[i][j] = max(maxSum(i + 1, j), maxSum(i + 1, j + 1)) + D[i][j];
        return memoryD[i][j];
    }
}

private static int max(int maxSum, int maxSum2) {
    return maxSum > maxSum2 ? maxSum : maxSum2;
}

}

你可能感兴趣的:(数据结构,算法)