题目链接
120. 三角形最小路径和 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/triangle/
这一题大家千万不要想着用贪心去做啊!贪心的代码不仅长,而且很容易出错。况且这就是一个dp模板题,连方程都不用推,肯定是想都不想直接dp了
注意几点:
1、dp是从上往下来看,可题目中说的是从下往上看,在写递推式的时候不要弄反了
2、注意限制的数组大小和数据范围。
另外,此题的主函数输入也很有趣,我一并给大家写出来了,希望和诸君共勉
//三角形最小路径和
int minimumTotal(vector<vector<int>>& triangle) {
int len = triangle.size();
if (len == 1)
{
return triangle[0][0];
}
int dp[100][100] = { 0 };
int ans = 0;
int i = 0;
dp[0][0] = triangle[0][0];
for (int i = 1; i < len; i++)
{
for (int j = 0; j < triangle[i].size(); j++)
{
if (j - 1 >= 0 && j < triangle[i - 1].size())
{
dp[i][j] = triangle[i][j] + min(dp[i - 1][j], dp[i - 1][j - 1]);
}
else if(j - 1 < 0)
{
dp[i][j] = triangle[i][j] + dp[i - 1][j];
}
else
{
dp[i][j] = triangle[i][j] + dp[i - 1][j - 1];
}
}
}
int minn = 100000;
for (int i = 0; i < len; i++)
{
minn = min(minn, dp[len - 1][i]);
}
return minn;
}
int main()
{
vector<vector<int>>tr;
int n = 1;
for (int i = 0; i < 3; i++)
{
vector<int>ret;
for (int j = 0; j < n; j++)
{
int a = 0;
cin >> a;
ret.push_back(a);
}
tr.push_back(ret);
ret.clear();
n++;
}
int ans = minimumTotal(tr);
cout << ans;
return 0;
}