题目:
解答:
方法一: 深搜 超时。
试图剪枝,当加和大于最小值时,剪枝,这样是不对的,因为后面的数有可能是负数。
代码:
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
int min = INT_MAX;
int sum = 0;
search(sum, 0, 0, triangle, min);
return min;
}
void search(int sum, int i, int row, vector<vector<int> > &triangle, int &min)
{
if (row == triangle.size())
{
if (sum < min)
{
min = sum;
}
}
else
{
int temp = sum + triangle[row][i];
search(temp, i, row + 1, triangle, min);
if (i + 1 < triangle[row].size())
{
temp = sum + triangle[row][i + 1];
search(temp, i + 1, row + 1, triangle, min);
}
}
}
};
解答二:
动态规划:
转移方式: 下一行某个数和的最小值等于该数加上上一行两个数中比较小的那个数。
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
例如: 最后一行第二个位置的sum[3][1]的最小值应该等于a[3][1]加上上一行中a[2][0]和a[2][1]和中的最小值。
代码:
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
int min = INT_MAX;
int sum[200][200];
sum[0][0] = triangle[0][0];
for (int i = 1; i < triangle.size(); i++)
{
for (int j = 0; j < triangle[i].size(); j++)
{
if (j == 0)
sum[i][j] = sum[i - 1][j] + triangle[i][j];
else if (j == triangle[i].size()-1)
sum[i][j] = sum[i - 1][j - 1] + triangle[i][j];
else
{
sum[i][j] = (sum[i - 1][j] < sum[i - 1][j - 1] ? sum[i - 1][j] : sum[i - 1][j - 1]) + triangle[i][j];
}
}
}
for (int i = 0; i < triangle[triangle.size() - 1].size(); i++)
{
if (sum[triangle.size() - 1][i] < min)
min = sum[triangle.size() - 1][i];
}
return min;
}
};