Triangle --找三角形数组中最小的路径(重重重)

来源:互联网 发布:coc狂暴升级数据 编辑:程序博客网 时间:2024/05/16 08:55

题目:

链接

解答:

方法一:  深搜  超时。

试图剪枝,当加和大于最小值时,剪枝,这样是不对的,因为后面的数有可能是负数。

代码:

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


0 0
原创粉丝点击