您的位置:首页 > 其它

leetcode -- Triangle -- dp题目重点

2015-12-15 23:26 351 查看
https://leetcode.com/problems/triangle/

思路1

一开始我的思路就是定义dp[i][j],即到第i行,第j个元素的min path的sum是多少,递推公式为

dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] (如果j !=0 and j != len(traiangel[i]) - 1)


思路2

但是可以优化到O(n)的空间

思路见http://chaoren.is-programmer.com/posts/43367.html

看code便知

class Solution:
# @param triangle, a list of lists of integers
# @return an integer
def minimumTotal(self, triangle):
length = len(triangle)
dp = [0 for i in xrange(length)]
for row in triangle:
oldDp = dp[:]#copy上一层的dp结果,因为当前层要用到上一层的结果进行计算
for i in xrange(len(row)):
if i == 0: #最左端点只可能被上一层的最左端点连接
dp[i] = oldDp[i] + row[i]
elif i == len(row) - 1:#最右端点只可能被上一层的最右端点连接
dp[i] = oldDp[i-1] + row[i]
else:#中间的节点可能被上一层相邻的两节点连接
dp[i] = min(oldDp[i], oldDp[i-1]) + row[i]
return min(dp)


思路3

现在已知第i行有j个元素,已经有了j个dp值,那么第i+1行有j+1个元素,每个dp[i+1][j]与dp[i][j]与dp[i][j-1]有关,所以从后往前求就可以更新这个数组



为了避免每次copy上一层的dp结果,从dp数组的后面往前赋值就行

参考/article/4981581.html,有更简便的办法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: