POJ1163三角形

本文介绍了一个经典的编程问题——寻找数字三角形中的最大路径和。通过递归、动态规划等方法实现了该问题的解决,并提供了具体的Java代码实现。适用于算法初学者及需要优化算法效率的开发者。

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;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值