动态规划--Triangle

Posted CSLearningBlog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划--Triangle相关的知识,希望对你有一定的参考价值。


    这道题也是来源于Leetcode,题目英文描述如下,比较简单,就不翻译了。

    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.

    这也是一道考察动态规划的基础题目。首先要搞清楚的是何为adjacent numbers。在这个题目里面,对于处于(i,j)位置处的数字,上一层中(i-1,j)和(i-1,j-1)是它的adjacent numbers,下一层中,(i+1,j)和(i+1, j+1)也是它的adjacent numbers。

    下面我们来简单分析一下解决这个题目的思路,如果把从(0,0)走到(i, j)位置处的最短路径和定义为f(i,j),那么很显然f(0,0) = triangle[0][0]。题目要求只能从一个点移动到下一层的adjacemt number。那么要从(0,0)走到(i, j),必须先从(0,0)走到(i-1,j)位置或者(i-1,j-1)位置。要想走到(i,j)处的路径和最短,那么走到(i-1,j)或者(i-1, j-1)位置处的路径和也必须为最短。因此,f(i, j) = min{f(i-1,j), f(i-1,j-1)} + triangle[i][j]。同时我们应该注意到在边界处的特殊情况,当j == 0时,想走到(i, 0)只能从(i-1,0)走,只有唯一一条路径,因此f(i, 0) = f(i-1, 0) + triangle[i][0];当j == len(triangle[i])-1时,想走到(i,j)只能从(i-1,j-1)走,也只有一条路径,因此f(i,j)=f(i-1,j-1)+triangle[i][j]。总结一下上述分析就是:

    根据上面的分析那么可以写出代码:

class Solution:
    def minimumTotal(self, triangle):
    """
    :type triangle: List[List[int]]
    :rtype: int
    """
    rows = len(triangle)
    for i in range(1, rows):
        for j in range(len(triangle[i])):
            if (j == 0):
                triangle[i][j] = triangle[i - 1][j] + triangle[i][j]
            elif (j == len(triangle[i - 1])):
                triangle[i][j] = triangle[i - 1][j -1] + triangle[i][j]
            else:
                triangle[i][j] = min(triangle[i - 1][j], triangle[i - 1][j - 1]) + triangle[i][j]
ans = min(triangle[-1])
return ans

    代码实现稍微做了一下变形,采用自底向上的计算方法,避免递归调用。

    今天是大年三十,祝所有的朋友新年快乐,来年大吉大利!


以上是关于动态规划--Triangle的主要内容,如果未能解决你的问题,请参考以下文章

Triangle(动态规划)

1163:The Triangle(动态规划)

POJ 1163:The Triangle(动态规划)

leetcode 动态规划类型题

动态规划_leetcode120(经典的梯形模式)

动态规划dp小练习课堂