您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息