/**
* @author Limg
* @date 2022/08/09
* 给定一个三角形 triangle ,找出自顶向下的最小路径和。
* 每一步只能移动到下一行中相邻的结点上。
* 相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层结点下标 +1 的两个结点。
* 也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
*/
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int minimumTotal(vector<vector<int>>& triangle);
int main()
{
//测试定义
int m=0;
cin>>m;
vector<vector<int> > triangle;
int value;
vector<int> temp;
for(int i=0;i<m;i++) //输入三角矩阵
{
for(int j=0;j<=i;j++)
{
cin>>value;
temp.push_back(value);
}
triangle.push_back(temp);
temp.clear();
}
//调用解题函数
cout<<minimumTotal(triangle)<<endl;
return 0;
}
/**
* 解题函数
* 思路为:计算[0,0]到[i,j]的最小路径和
* 由于存在空间限制,因此每次只存储第i层所有元素的最小路径和
*/
int minimumTotal(vector<vector<int>>& triangle)
{
int length = triangle.size();
long record[length];
record[0] = triangle[0][0];
for(int i=1;i<length;i++) //i - 三角形第i层
{
long temp_left = record[0]; //记录上一层三角形左值
record[0] += triangle[i][0];
for(int j=1;j<i;j++) //j - 三角形第i层第j列
{
long temp_right = record[j]; //记录上一层三角形右值
record[j] = min(temp_left,temp_right)+triangle[i][j]; //取上一层三角形左右路径和更小值
temp_left = temp_right; //这里注意!
}
record[i] = temp_left + triangle[i][i];
}
long min_sum = record[0];
for(int i=1;i<length;i++) //取最小路径和
{
if(record[i]<min_sum)
{
min_sum = record[i];
}
}
return min_sum;
}
力扣120.三角形最小路径和(动态规划)
最新推荐文章于 2024-05-31 17:17:25 发布