【问题】给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:

[
[],
[,],
[,,],
[,,,]
]
自顶向下的最小路径和为 (即, + + + = )。

【第一种思路】

直接暴力递归,将各种情况进行穷举,但是必定会超时,通过递归的方法我们可以得到核心的递归表达式:
triangle[x][y] += min(triangle[x+1][y], triangle[x+1][y+1]), 这是由于三角形的下一行只比上一行多一个数的规律导致的!

class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
return dfs(, , triangle);
}
int dfs(int x, int y,vector<vector<int>>& triangle) {
if (x == triangle.size() )
return ;
return triangle[x][y] + min(dfs(x + , y, triangle),dfs(x + , y + , triangle));
}
};

【第二种思路】既然有了递归式,就可以把暴力递归改成动态规划了!这里说一个原地动态规划的解法!
类似于搭积木的原理,从底向上,在每一层都取两个数的最小值加到上一层去,一层层累积上去,直到顶部,最短路径就是triangle[0][0]。

class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
for(int i = triangle.size()-; i >= ; --i){
for(int j = ; j < triangle[i].size(); ++j){
triangle[i][j] += min(triangle[i+][j], triangle[i+][j+]);
// triangle[i+1][j+1]不会越界,第i+1行比第i行多一个值
}
}
return triangle[][];
}
};

最新文章

  1. CSS盒子模型与box-sizing
  2. Effective Java Index
  3. 使用LKDBHelper 插入相同id时候应该是更新数据而不是插入新的数据
  4. tomcat服务器 去掉端口8080 以及项目名 直接使用IP地址访问
  5. 预定义异常 - PHP手册笔记
  6. boost 轻量级信号量
  7. 解决select2 在modal中搜索框无效的问题
  8. day01 python入门之路
  9. SQL实现如何计算项目进度总共天数情况、已经施工天数情况、以及施工进度百分比
  10. HP Elitebook 830 G5/Win10蓝屏 UcmUcsi.sys 错误解决
  11. Beta冲刺——第四天
  12. 【适合公司业务】全网最详细的IDEA里如何正确新建【普通或者Maven】的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(类似eclipse里同一个workspace下【多个子项目】并存)(图文详解)
  13. Shell与Bash
  14. conding.net或github,readme.md添加图片
  15. 根据前面的FtpUtil写一个demo
  16. polymer-developer guide-registration and lifecycle
  17. VS2010一调试就卡死的问题解决方案 (转)
  18. ubuntu 12.04下apache 配置家目录地址
  19. Java AOP总结
  20. Vue中 key keep-alive

热门文章

  1. 循环语句(for语句的用法)
  2. VS2019 发布单文件
  3. MySQL之innodb和myisam的区别
  4. 1-使用React的方式
  5. Struts2学习(五)
  6. STM32新MCU
  7. DAC
  8. [Android实例] Android网络收音机项目(内含源码)
  9. Android学习笔记17:单项选择RadioButton和多项选择CheckBox的使用
  10. Uber为何会成为共享经济中全球市值最大的独角兽企业?