Leetcode dfs&dp Triangle

Triangle

Total Accepted: 17536 Total
Submissions: 65508My Submissions

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.

题意:给定一个三角阵,三角阵里每个位置有一个数值。

找到一条由顶到底的路径,使得路径里的数值总和最小。

每次可以向当前位置的下一行的左或右走。

思路1:dfs + 备忘录

在第i行的第j个位置,往下有两种走法的选择,往第i +1行的第j个位置或第j+1位置

在第i+1行的第j个位置或第j+1个位置的子问题与原问题相同,可用dfs递归求解

用一个数组_min[i][j]保存求解过程的值,避免重复计算。

复杂度:时间O(n ^2),空间O(n^2)

思路2:dp + 滚动数组

设dp[i][j] 表示到达第i行第j个位置的路径的最小数值,则状态转移方程为

dp[i][j] = min(dp[i-1][k]) + A[i][j] 其中 dp[i-1][k]表示可到达dp[i][j]状态的上一个状态

在这里 k可以取 j -1 或 j,A[i][j]表示这个位置的值

因为在第i行只需要用到第i-1行的数据所以可以不用保存i-1前面的最优值。

最后只要用到数组 dp[j] 就可以

复杂度:时间O(n^2),空间O(n)

//思路1
vector<vector<int> > _min, _triangle;
int dfs(int i, int j){
	if(i == _triangle.size() - 1){
		return _triangle[i][j];
	}
	if(j < 0 || j >= _triangle[i].size()) return INT_MAX;
	if(_min[i][j] != INT_MAX) return _min[i][j]; //某个特殊值表示 dfs(i,j)还没被计算过
	return _min[i][j] = min(dfs(i + 1, j), dfs(i + 1, j + 1)) + _triangle[i][j];
}

int minimumTotal(vector<vector<int> > &triangle) {
	if(triangle.empty()) return 0;
 	_triangle = triangle;
	_min = vector<vector<int> >(triangle.size(), vector<int>(triangle[triangle.size() - 1].size(), INT_MAX));
	return dfs(0, 0);
}
//思路2
int minimumTotal(vector<vector<int> > &triangle) {
	if(triangle.empty()) return 0;
	vector<int> dp(triangle.back().size(), 0);
	//初始化
	int i = 0;
	for_each(triangle[0].begin(), triangle[0].end(),[&i, &dp](int &v){
		dp[i++] = v;
	});
	//迭代更新dp
	for(i = 1; i < triangle.size(); ++i){
		int dp_j_1 = dp[0];
		for(int j = 0; j < triangle[i].size(); ++j){
			int tem = dp[j];
			if(j == triangle[i].size() - 1) dp[j] = dp_j_1;
			dp[j] = min(dp_j_1 ,dp[j]) + triangle[i][j];
			dp_j_1 = tem;
		}
	}
	int _min = INT_MAX;
	for(int j = 0; j < dp.size(); ++j)
		_min = min(_min, dp[j]);
	return _min;
}
时间: 2024-10-12 20:30:45

Leetcode dfs&dp Triangle的相关文章

LeetCode——Pascal&#39;s Triangle

Description: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] public class Solution { public List<List<Integer>> generate(int numRows) { List

LeetCode——Pascal&#39;s Triangle II

Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. public class Solution { public List<Integer> getRow(int rowIndex) { List<List<Integer>> list = new ArrayList<List&

LeetCode: Pascal&#39;s Triangle 解题报告

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] SOLUTION 1:很easy的题.注意记得把List加到ret中.比较简单,每一行的每一个元素有这个规律:1. 左右2边的是1.i, j 表示行,列坐标.2.

LeetCode: Pascal&#39;s Triangle II 解题报告

Pascal's Triangle II Total Accepted: 19384 Total Submissions: 63446 My Submissions Question SolutionGiven an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3,3,1]. Note:Could you optimize your algorithm to us

dfs+dp思想的结合------hdu1078

首先是题目的意思: 从一个正方形的0,0点开始走,只能横着走,竖着走,最多走k步,下一个点的数一定要比当前这个点的值大,每走一步,就加上下一个点的数据,问数据最大能有多少. 首先遇到这种题目,走来走去的,一开始想到的是搜索,但是搜索我们搜的很多是路径,能走到那个点的最短路,但是这道题目不一样. 首先要注意的一点是,如果没有条件的搜索,那就是枚举.只有搜遍了才能得到最后的解. 1s题,只是搜的话肯定TLE了. 所以我们想到的自然就是dp了.dp的好处是什么?就是能减少不必要的搜索.用已知的结果减少

HDU-4924-Football Manager(DFS+DP)

Problem Description Football Manager is a series of football management simulation games developed by Sports Interactive and published by Sega. In this game, you will play a role of a football club manager and conduct your team to chase championship

记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

题目传送门 1 /* 2 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 3 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操作必然是1红1黑 4 考虑三种情况:a[]连续两个颜色相同,输出11:b[]连续两个相同,输出22: 5 a[x] != b[y], 输出12:否则Impossible 6 详细解释:http://blog.csdn.net/jsun_moon/article/details/10254

NYOJ 10 skiing DFS+DP

skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从

(LeetCode)Pascal&#39;s Triangle --- 杨辉三角

Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] Subscribe to see which companies asked this question 解题分析: 题目的这个帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉