数字三角形是一个由数字组成的三角形,其中每个数字是从上面相邻两个数字中选择的最小值。设计一个算法,给定一个数字三角形,计算从顶部到底部的最小路径和。

算法设计步骤如下:

  1. 定义状态:设状态f[i][j]表示从数字三角形顶部到(i, j)位置的最小路径和。

  2. 状态转移方程:由于每个数字只能从上面相邻的两个数字中选择最小值,所以状态转移方程为:

f[i][j] = min(f[i-1][j], f[i-1][j-1]) + triangle[i][j]

其中triangle[i][j]表示数字三角形第i行第j列的数字。

  1. 边界条件:最顶部的状态为f[1][1] = triangle[1][1],最底部的最小路径和为min(f[n][j]),其中n为数字三角形的行数,j为最底部一行的任意一列。

  2. 求解最小路径和:根据状态转移方程,从顶部开始逐行计算状态,最终得到最小路径和。

代码实现如下:

int minimumTotal(vector<vector<int>>& triangle) {
    int n = triangle.size();
    vector<vector<int>> f(n, vector<int>(n, 0));
    f[0][0] = triangle[0][0];
    for (int i = 1; i < n; i++) {
        f[i][0] = f[i-1][0] + triangle[i][0];
        for (int j = 1; j < i; j++) {
            f[i][j] = min(f[i-1][j], f[i-1][j-1]) + triangle[i][j];
        }
        f[i][i] = f[i-1][i-1] + triangle[i][i];
    }
    int ans = f[n-1][0];
    for (int j = 1; j < n; j++) {
        ans = min(ans, f[n-1][j]);
    }
    return ans;
}
数字三角形最小路径和算法设计与实现

原文地址: https://www.cveoy.top/t/topic/oo6d 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录