数字三角形
来源:互联网 发布:php和javascript哪个难 编辑:程序博客网 时间:2024/06/06 01:37
题目描述:给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
样例:比如,给出下列数字三角形:
[[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。
按照之前讲的动态规划的解法,还是分两步,1. 找转移方程,2. 处理边界及初始的条件
1. 根据规律,到达其中某一层的最小路径为到达这一层的所有位置的最小路径的最小值。所以,可以用一个数组record保存第i - 1层中到达所有位置所需要的最小路径,用一个临时数组temp保存当前处理的层的每个位置的最小路径。比如,当我们处理第二层时,temp[0] 就表示到达样例中数字3那个位置的最小路径。
显然,当前层,第j个位置的最小路径是由上一层每个位置的最小路径得到的。根据题意,只能在相邻的数字间走动,所以,可得状态转移方程:temp[j] = min(record[j - 1], record[j]) + triangle[i][j],其中,triangle为表示数字三角形的二维数组。
2. 初始条件肯定是要令temp = [triangle[0][0]];边界上,要注意,当求取temp[0]时,record[-1]是不存在的,而当求取temp[i]时(i为行数,也就是每层的最后一个位置),record[i]也是不存在的。
给出代码:
class Solution: """ @param triangle: a list of lists of integers. @return: An integer, minimum path sum. """ def minimumTotal(self, triangle): m = len(triangle) if m == 0: return 0 record, temp = [triangle[0][0]], [] i, j = 1, 0 while i < m: while j < i + 1: if j - 1 >= 0 and j <= i - 1: temp.append(min(record[j - 1], record[j]) + triangle[i][j]) elif j - 1 < 0: temp.append(record[j] + triangle[i][j]) else: temp.append(record[j - 1] + triangle[i][j]) j += 1 record = temp temp = [] j = 0 i += 1 return min(record) # write your code here需要注意的是,我们没有整个建立一个二维数组来存储结果,而是通过record和temp两个数组的交换完成了动态规划记录的任务。
0 0
- 数字三角形!
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- 数字三角形
- IntelliJ Idea 常用快捷键列表
- Bootstrap排版
- hibernate循环插入数据
- TIJ 复习笔记5
- 别等30恨自己:20多岁可以完成的16件小事
- 数字三角形
- c++笔记20160612
- 所有Mac用户都需要知道的9个实用终端命令行
- IBM APPSCAN 之安全学习
- 静态库和共享库(动态库) 动态调用共享库 C的错误处理
- argc argv传参
- POJ 1543 Perfect Cubes
- 数据库快照的建立,并使用它恢复原数据库
- Bootstrap表单按钮图标