📌  相关文章
📜  给定三角形的第N行中所有数字的总和(1)

📅  最后修改于: 2023-12-03 15:11:39.376000             🧑  作者: Mango

求解三角形行总和

当给定一个三角形,我们想要求取其中某一行(第 N 行)的所有数字的总和,该怎么办呢?

我们可以利用二维数组来存储三角形,其中 triangle[i][j] 表示第 i 行第 j 列的数字。为了方便,我们可以将第一行的数字作为三角形的开头,并添加一个额外的 0 在其前面,以保证每一行都有两个数字。

接下来我们从第二行开始遍历每一行,对于每一行中的每一个数字,我们可以用它的左上角和右上角元素相加,得到它自己的值,并将其添加到答案中。最终答案即为第 N 行中所有数字的总和。

下面是 Python 和 Java 的实现代码:

Python 代码
def row_sum(triangle, n):
    dp = [[0]*(len(triangle)+2) for _ in range(len(triangle)+2)]
    dp[1][1] = triangle[0][0]
    for i in range(2, len(triangle)+2):
        for j in range(1, i+1):
            dp[i][j] = triangle[i-2][j-1] + max(dp[i-1][j-1], dp[i-1][j])
    return sum(dp[n+1])
Java 代码
public static int rowSum(int[][] triangle, int n) {
    int[][] dp = new int[triangle.length+2][triangle.length+2];
    dp[1][1] = triangle[0][0];
    for (int i = 2; i <= triangle.length+1; i++) {
        for (int j = 1; j <= i; j++) {
            dp[i][j] = triangle[i-2][j-1] + Math.max(dp[i-1][j-1], dp[i-1][j]);
        }
    }
    int sum = 0;
    for (int i = 1; i <= triangle.length+1; i++) {
        sum += dp[n+1][i];
    }
    return sum;
}

以上两个实现都采用了动态规划的方法,时间复杂度为 O(n^2),空间复杂度为 O(n^2)。其中双重循环中的 i 和 j 分别代表了第几行和第几列,dp[i][j] 表示从第一行开始到 (i,j) 位置所能得到的最大值。最终答案是 dp[n+1][1] 到 dp[n+1][n+1] 的和。

参考资料