动态规划|约束条件下的三角最短路径
这篇文章总结了题目如何符合动态规划的特点,进而如何利用动态规划求解三角约束条件下的最短路径。
1
题目
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).
一套三角路径是指,第k行的第i个元素,只能与第k+1行的第i个元素或第i+1个元素组合,依次规律,到达三角形的bottom.
2
动态规划的特征
求解第k行到bottom的最短路径时,需要求此行的任意一个节点i加上第k+1行到bottom的最短路径,显然这具备了最优子结构的特征;
同时,在求第k-1行到bottom的最短路径时,需要求解第k行到bottom的最短路径,在求第k行到bottom的最短路径时,需要再次求解第k+1行到bottom的最短路径,因此又具备了重复的子问题特征。
综上,可以用动态规划方法求解。
自top到bottom求解,还是自bottom到top? 简单来讲,top层的最短路径一旦求出,这个问题就求出来了,如果从bottom开始求解,bottom的最大路径就是这层各自节点的值。
所以,选择从bottom到top的动态规划算法。
3
列出转移方程
求解第k行到bottom的最短路径时,需要求此行的任意一个节点i加上第k+1行到bottom的最短路径,显然这具备了最优子结构的特征;
题目的输入数据结构: input[n][n]
创建缓存: minpath[n],初始值为最后一层的节点取值。因为是自bottom到top,因此这样赋初始值是合理的,只有一层的最短路径就是在这些节点中选取。
由第k+1层的最短路径,推出第k层的最短路径,标颜色的部分实际上存储着第k+1层的最短路径:
minpath[i] = min(minpath[i], minpath[i+1]) + triangle[k][i];
赋完值后,实际上得到第k层的第i个节点到bottom的最短路径。
因此,遍历第k层的所有节点,便求出了第k层的所有节点到bottom的最短路径,实际上就是更新minpath数组。
以上,问题的分析,不准确的地方,敬请指正。
- Java设计模式-观察者模式
- 今天处理的三个小问题——20160120(r7笔记第84天)
- 主备切换的准备工作(r7笔记第83天)
- Java设计模式-外观模式
- Java设计模式-组合模式
- 使用shell批量监控磁盘坏块(二) (r7笔记第80天)
- JavaWeb10-request&response你不得不学(1)
- dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)
- 最近让我焦灼的四个问题(有解) (r7笔记第76天)
- JavaWeb10-reques;response你不得不学(2)
- 很多人比较纠结的约束和索引的关系(r7笔记第75天)
- JavaWeb09-Servlet(Java真正的全栈开发)
- JavaWeb08-XML,tomcat,HTTP轻松入门
- JavaWeb07-JDBC(Java真正的全栈开发)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记
- alloc 和 init都做了什么验证。
- 回顾冒泡排序(新增优化代码)
- 计算输入的一句英文语句中单词数
- 《剑指offer》第21天:合并两个有序链表
- 单细胞转录组基础分析六:伪时间分析
- 使用PaintCode便捷地实现动画效果
- 用墨卡托和GPS坐标计算距离时误差测试
- 单细胞转录组基础分析五:细胞再聚类
- Semaphore回顾
- iOS13 关闭黑暗模式+状态栏显示问题解决方法
- 0807-6.2.0-CDSW中Session列表和team分析
- 单细胞转录组基础分析八:可视化工具总结
- 单细胞转录组基础分析七:差异基因富集分析
- 定位权限请求时易犯的错误小结