Triangle
来源:互联网 发布:unix高级编程第四版pdf 编辑:程序博客网 时间:2024/06/09 22:22
Triangle
Total Accepted: 16109 Total Submissions: 60327My SubmissionsGiven a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[ [2], [3,4], [6,5,7], [4,1,8,3]]
The minimum path sum from top to bottom is 11
(i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
思路1:搜索题,找出从顶到底路径中最小的和,则要在所有路径中即可行解中找出最优解。
直接用dfs查找TLE,因为有很多路径重复计算了。
class Solution {public: int minimumTotal(vector<vector<int> > &triangle) { if (triangle.empty()) return 0; ans = INT_MAX; dfs(triangle, 1, 0, triangle[0][0]); return ans; }private: int ans; void dfs(vector<vector<int> > &triangle, int depth, int col, int sum) { // update solution if (depth == triangle.size()) { if (sum < ans) ans = sum; return; } dfs(triangle, depth + 1, col, sum + triangle[depth][col]); dfs(triangle, depth + 1, col + 1, sum + triangle[depth][col + 1]); }};
思路2:为了避免重复计算,采用备忘录,用一个数组保存那个位置到底端的最优解。
class Solution {public: int minimumTotal(vector<vector<int> > &triangle) { if (triangle.empty()) return 0; for (int i = 0; i < triangle.size(); ++i) { memory.push_back(vector<int>(triangle[i].size(), INT_MAX)); } return find(triangle, 0, 0); }private: vector<vector<int> > memory; int find(vector<vector<int> > &triangle, int depth, int col) { if (memory[depth][col] != INT_MAX) { return memory[depth][col]; } if (depth == triangle.size() - 1) { return memory[depth][col] = triangle[depth][col]; } int left_sum = find(triangle, depth + 1, col); int right_sum = find(triangle, depth + 1, col + 1); int min_sum = min(left_sum, right_sum); min_sum += triangle[depth][col]; return memory[depth][col] = min_sum; }};
思路3:动态规划,从底向上,存储到低端的最优解,求解当前最优解时,只需用到下一层相邻节点的最优解。
方程:dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j] ( 0 <= i < max_depth-1)。
class Solution {public: int minimumTotal(vector<vector<int> > &triangle) { if (triangle.empty()) return 0; for (int i = 0; i < triangle.size(); ++i) { dp.push_back(vector<int>(triangle[i].size(), 0)); } int depth = triangle.size() - 1; int col = 0; for ( ; col < triangle[depth].size(); ++col) { dp[depth][col] = triangle[depth][col]; } for (depth = triangle.size() - 2; depth >= 0; --depth) { for (col = 0; col < triangle[depth].size(); ++col) { dp[depth][col] = min(dp[depth + 1][col], dp[depth + 1][col + 1]) + triangle[depth][col]; } } return dp[0][0]; }private: vector<vector<int> > dp;};
0 0
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- 【欧拉函数】 HDOJ 3501 Calculation 2
- hdu 1350 Taxi Cab Scheme(二分图最小路径覆盖)
- CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)
- Java Map集合之HashMap、HashTable
- 关键帧动画CAKeyframeAnimation
- Triangle
- Cocos2d-JS打包, cocos2dx-3.0
- ubuntu13.04和windows双系统启动顺序的修改
- java笔记-银行业务调度系统
- Effective c++ 第三章 (资源管理)
- java如何调用webservice接口
- 新的开始
- 美食管家餐饮管理系统
- LeetCode题目索引