Triangle

原创 2016年08月29日 09:01:16

方法1:dfs,时间复杂度是指数,排除

方法2:采用有向图求最短路径的方法,每个元素是一个节点,边的权值等于两个节点的值的和,把所有元素用邻接表存起来,设三角形最后一行有c个数,那么分别以这c个数作为路径寻找的终点,做c次dijkstra,得到c个最短路径,再在c个最短路径中找一个最小的,这个最小的值就是答案,这种方法的时间复杂度是O(cn),就是操作起来太麻烦。

方法3:动态规划,dp数组用了额外的O(n)的空间,时间复杂度O(n),扫描一次就得到了所有的c个结果,比上一个方法好太多了,进一步优化,由于递推式为f(i, k) = min{f(i-1,k),  f(i-1,k-1)} + d(i, k),f(i,k)表示到第i层的第k个顶点的最小路径长度,d(i, k)表示原来三角形数组里的第i行第k列的元素,那么可以直接用triangle数组存递推的结果,代码如下:

class Solution {
public:
	int minimumTotal(vector<vector<int> > &triangle) {
		int length = triangle.size();
		if (length == 0) {
			return 0;
		}

		int i, j;
		for (i = 1; i<length; i++) {
			int length_inner = triangle[i].size();
			//每一行中的第一和最后一个元素在上一行中只有一个邻居。而其他中间的元素在上一行中都有两个相邻元素
			for (j = 0; j<length_inner; j++) {
				if (j == 0) {
					triangle[i][j] = triangle[i][j] + triangle[i - 1][j];
				}
				else if (j == length_inner - 1) {
					triangle[i][j] = triangle[i][j] + triangle[i - 1][j - 1];
				}
				else {
					triangle[i][j] = (triangle[i][j] + triangle[i - 1][j - 1] < triangle[i][j] + triangle[i - 1][j] ? triangle[i][j] + triangle[i - 1][j - 1] : triangle[i][j] + triangle[i - 1][j]);
				}
			}
		}
		int min_path = triangle[length - 1][0];
		for (i = 1; i<triangle[length - 1].size(); i++) {
			min_path = (min_path < triangle[length - 1][i] ? min_path : triangle[length - 1][i]);
		}
		return min_path;
	}
};




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

The Triangle

  • 2017-09-13 14:46
  • 780B
  • 下载

pascal triangle

zoj 3598 Spherical Triangle 一道很纯的公式题,经纬线计算球面内角和

给你三个点的经纬度,计算在球面上的三个内角和。 计算两点各自距离,用数学公式计算下内角。

红宝书第一个代码TRIANGLE

  • 2015-12-28 11:37
  • 10.97MB
  • 下载

triangle-响应式bootstrap模板

  • 2016-09-18 23:39
  • 10.98MB
  • 下载

poj 1163 The Triangle

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路 径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求 出最佳路径上的数字之和。   动...

triangle.java

The triangle

[leetcode]Pascal's Triangle

Pascal's Triangle

opengl jni triangle

  • 2016-01-04 22:09
  • 103KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)