leetcode-华为专题-120. 三角形最小路径和

 

 

第一种dfs,用例还剩最后一个超时了

class Solution {
public:
    int res = INT_MAX;
    // int m = 0;
    // int n = 0;
    int minimumTotal(vector<vector<int>>& triangle) {
        // m = triangle.size()-1;
        // n = triangle[0].size()-1;
        dfs(triangle,0,0,0);
        return res;
    }

    void dfs(vector<vector<int>>& triangle, int sum, int i, int j){  
        int m =triangle.size()-1;
        int n = triangle[i].size(); 
        // cout<<"m: "<<m<<" n: "<<n<<endl;
        // cout<<"i: "<<i<<" j: "<<j<<endl;
        if(i>m||j>n)
            return;
        if(i==m){
            sum = sum + triangle[i][j];
            res = min(res, sum);
            //cout<<"res: "<<res<<endl;
            return;
        }
        sum = sum + triangle[i][j];
        if(sum>=res) return;
        dfs(triangle,sum,i+1,j);
        dfs(triangle,sum,i+1,j+1);
    }
};

第二种动态规划:

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        vector<vector<int>> f(n, vector<int>(n));

        // f[i][j] 含义:从顶部到i行j列的最小路径和
        // base case
        f[0][0] = triangle[0][0]; // 第一个只有一个元素,f[0][0]就等于此元素
        for(int i = 1; i < n; i++){
            f[i][0] = f[i - 1][0] + triangle[i][0]; // 每一行最左侧=上一行最左侧 + 元素
            f[i][i] = f[i - 1][i - 1] + triangle[i][i]; //最右侧 = 上一行最右侧 + 元素
        }
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < i; ++j) {
                // 此步在(i,j),上一步就只能在位置(i−1,j−1)或者位置 (i−1,j)。
                f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j];
            }
        }
        // 最终的答案即为 f[n−1][0]到f[n−1][n−1]中的最小值,
        int res = INT_MAX;
        for(int i = 0; i < f[n-1].size();i++){
            res = min(res, f[n-1][i]);
        }
        // return *min_element(f[n - 1].begin(), f[n - 1].end());
        return res;
    }
};

 

posted @ 2021-08-17 21:38  三一一一317  阅读(46)  评论(0)    收藏  举报