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.

算法分析:

本题需要采用动态规划来解决。我们用一个二维数组dp[i][j]来表示在题中三角形中,到达三角形的第i行,第j列的路径的权值之和。该动态规划算法的状态转移方程如下:当我们要计算dp[i][j]的值,我们需要利用上一层已经算好的信息,即从dp[i-1][j-1]+triangle[i][j]和dp[i-1][j]+triangle[i][j]这两个数中取一个最小值。因为位置(i,j)只能由上一层的位置(i-1,j-1)或者位置(i-1,j)往下走来获得,而到达上一层的最小代价我们也已经计算得出,那么就可以利用这两个值来算出到达位置(i,j)的最小代价。在边界时,位置(i,0)则只能由(i-1,0)往下走得到,最后一个位置只能由上一行的最后一个位置往下走来获得。代码实现如下:

int minimumTotal(vector<vector<int>>& triangle) 
{
	if (triangle.size() == 0)
		return 0;

	vector<vector <int> > dp(triangle.size(), vector<int>(triangle[triangle.size()-1].size(), 0));

	dp[0][0] = triangle[0][0];
	for (int i = 1; i < triangle.size(); i++)
	{
		for (int j = 0; j < triangle[i].size(); j++)
		{
			if (j == 0)
			{
				dp[i][j] = dp[i - 1][0] + triangle[i][j];
				continue;
			}
			if (j == triangle[i].size() - 1)
			{
				dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
				continue;
			}

			dp[i][j] = min(dp[i - 1][j - 1] + triangle[i][j], dp[i - 1][j] + triangle[i][j]);
		}
	}

	int len = triangle[triangle.size() - 1].size();
	int m = dp[triangle.size() - 1][0];
	for (int i = 1; i < len; i++)
	{
		m = min(m, dp[triangle.size() - 1][i]);
	}
	return m;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值