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