leetcode -- Triangle -- dp题目重点
2015-12-15 23:26
375 查看
https://leetcode.com/problems/triangle/
思路见http://chaoren.is-programmer.com/posts/43367.html
看code便知
为了避免每次copy上一层的dp结果,从dp数组的后面往前赋值就行
参考/article/4981581.html,有更简便的办法
思路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,有更简便的办法
相关文章推荐
- 51nod贪心例子活动安排问题二
- 《多线程之GCD》
- storm入门教程 第一章 前言
- 移动web开会发一些问题
- Objective-C中的内存管理
- ViewPager结合ImageView实现图片轮播的实例
- php中以双下划线打头的作用
- cursorindexoutofboundsException: After last row 分析
- Day Five (beta)
- struts2学习笔记(二)
- 自己写 el 函数
- My SQL ON DUPLICATE KEY UPDATE
- 数据库的配置文件注释
- PHP中的traits
- 安卓客户端上传文件到服务器的时候返回码416
- 118 php 小技巧
- 第三个spring冲刺第9天
- 基于继承的拖拽
- BZOJ 1412 狼和羊的故事
- 部署和调优 1.3 pureftp部署和优化-2