Leetcode 120.Triangle

来源:互联网 发布:富人国 知乎 编辑:程序博客网 时间:2024/06/04 19:17

Triangle

问题描述:
给出一个三角形状的矩阵,找出从上到下的最小路径,每一次只能走相邻的位置,下面是给出的例子:

[     [2],    [3,4],   [6,5,7],  [4,1,8,3]]

最短路径为11,即2 + 3 + 5 + 1 = 11。
很显然的动态规划的问题 ,每一步都选前面两个中最小的就是最优的了,例如当前在triangle[i][j],之前记录最小路径的矩阵为matrix,那么matrix[i][j] = min(matrix[i - 1][j - 1], matrix[i - 1][j]) + triangle[i][j]; 就是triangle[i][j]的最短路径了。答案即是matrix最后一行中最小的值。
以下是代码:

class Solution {public:    int minimumTotal(vector<vector<int>>& triangle) {        int r_size = triangle.size(), c_size = triangle[r_size - 1].size();        if(r_size == 1 && c_size == 1) return triangle[0][0];        if(r_size == 1 && c_size != 1) {            auto t = min_element(triangle[0].begin(), triangle[0].end());            return *t;        }        int matrix[r_size][c_size] = {INT_MAX};        for (int i = 0; i < r_size; i++)            for (int j = 0; j < c_size; j++)                matrix[i][j] = INT_MAX;        matrix[0][0] = triangle[0][0];        int res = INT_MAX;        for (int i = 1; i < r_size; i++) {            for (int j = 0; j < triangle[i].size(); j++) {                if(j == 0) {                    matrix[i][j] = matrix[i-1][j] + triangle[i][j];                } else {                    matrix[i][j] = min(matrix[i - 1][j - 1], matrix[i  - 1][j]) + triangle[i][j];                }                if(i == r_size - 1 && matrix[i][j] < res) res = matrix[i][j];             }        }        return res;    }};