Leetcode-120_Triangle(三角形)—动态规划解法+记忆化搜索解法-【C++】
2018-02-06 17:00
537 查看
Leetcode 120. Triangle(三角形)
Given 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.
因为这道题它提示了可以额外开的空间仅为O(n),所以尽量使用动态规划从底向上解题比较符合题目的要求 所以我先用了动态规划解决了:该程序在Leetcode上运行的结果是7ms
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int n = triangle.size();//n行 for(int i=n-2;i>=0;i--) { for(int j=0;j<=i;j++) { triangle[i][j]=min(triangle[i][j]+triangle[i+1][j],triangle[i][j]+triangle[i+1][j+1]); } } return triangle[0][0]; } };
然后我又尝试着使用记忆化搜索的方法做了一遍,当是锻炼一下自己的递归函数的使用,结果发现运行时间也是7ms
int n; vector<vector<int> >memo; int dp(int i,int j,vector<vector<int> >& triangle) { if(i==(n-1)) return triangle[i][j]; if(memo[i][j]!=-1) return memo[i][j]; int res = min(dp(i+1,j,triangle),dp(i+1,j+1,triangle))+triangle[i][j]; memo[i][j]=res; return res; } int minimumTotal(vector<vector<int> >& triangle) { n = triangle.size();//n行 memo=vector<vector<int> >(n,vector<int>(n,-1)); return dp(0,0,triangle); }
提交之前可以先尝试着自己制作测试用例,我把完整的动态规划的代码贴出来:
#include <iostream> #include <bits/stdc++.h> #include <vector> using namespace std; int minimumTotal(vector<vector<int> >& triangle) { int n = triangle.size();//n行 for(int i=n-2;i>=0;i--) { for(int j=0;j<=i;j++) { triangle[i][j]=min(triangle[i][j]+triangle[i+1][j],triangle[i][j]+triangle[i+1][j+1]); } } return triangle[0][0]; } int main(int argc, char *argv[]) { //vector<int> memo = vector<int>(n+1,-1) vector<vector<int> > tt ; vector<int> v; int j; //自己制作测试用例 for(int i=3;i<9;i++) { v.push_back(i); tt.push_back(v); for( j=0 ;j < v.size();j++) cout<<v[j]; cout<<endl; } cout<< minimumTotal(tt); return 0; }
相关文章推荐
- Leetcode-64_. Minimum Path Sum(最小路径和)—动态规划解法+记忆化搜索解法-C++解
- leetcode之392. Is Subsequence(C++解法 动态规划 贪心 模式匹配)
- Leetcode 120 Triangle 三角形最小路径和
- 【LeetCode】120. Triangle 基于C++和Java的分析及解法,动态规划
- 【LeetCode】132. Palindrome Partitioning II 基于动态规划DP、C++、Java的分析及解法
- [leetcode-120]Triangle(c++)
- leetcode之70. Climbing Stairs(C++解法 动态规划思想)
- leetcode-120-Triangle 动态规划
- 【LeetCode-120】Triangle(C++)
- 【LeetCode】Best Time to Buy and Sell Stock IV 动态规划dp解法(C++)
- leetcode_120 Triangle_动态规划
- Leetcode_c++: Triangle (120)
- [LeetCode 120] - 三角形(Triangle)
- 【LeetCode-面试算法经典-Java实现】【120-Triangle(三角形)】
- 【LeetCode-面试算法经典-Java实现】【120-Triangle(三角形)】
- LeetCode(120) Triangle
- LeetCode - 119. Pascal's Triangle II - 思路详解 - C++
- leetcode 120 Triangle
- leetcode之27. Remove Element(C++解法)
- leetcode 120: Triangle