DP问题练习1:数字三角最短路径问题
DP问题练习1:数字三角最短路径问题
问题描述
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
样例:
比如,给出下列数字三角形:
2
3 4
6 5 7
4 1 8 3
从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。
思路
我们给每一个位置标上坐标
2 (0,0)
3 4 (1,0) (1,1)
6 5 7 ...
4 1 8 3 ...
我们用f(i,j)表示从(i,j)位置一直到三角形底部的最小路径和。
那么f(0,0) = min(f(1,0),f(1,1))+Value(0,0); Value(0,0)就是值2
f(1,0) = min(f(2,0),f(2,1))+Value(1,0);
...
1.推导出状态转移方程:
f(i,j) = min(f(i+1,j),f(i+1,j+1)) + Value(i,j)。
利用这个状态转移方程我们可以写出一个递归函数。
2.递归的边界确定:
对于f(i,j),当:
i == 三角形高度-1 的时候,直接返回Value(i,j)
代码:
(function(){
main();
})();
/**
* [三角问题最小路径和]
* @param {[Array]} triangleList [trianglelist]
* @return {[Number]} [length of minimumTotal]
*/
function minimumTotal(triangleList){
//这个DP问题的状态转移方程
//f(i,j) = min(f(i+1,j),f(i+1,j+1))+(i,j) f(i,j)表示当前步骤(i,j)走到最后,所对应的最小路径和
var triangleHeight = getTriangleHeight(triangleList);
function calResult(i,j){
if(i == triangleHeight-1){
return triangleList[getIndex_i(i)+j];
}else{
var res1 = calResult(i+1,j);
var res2 = calResult(i+1,j+1);
return Math.min(res1,res2)+triangleList[getIndex_i(i)+j];
}
}
return calResult(0,0); }
/**
* 获取三角形有多少行
* @param {[Array]} triangleList [description]
* @return {[Number]} [description]
*/
function getTriangleHeight(triangleList){
var height = 0.5*(Math.sqrt(1+triangleList.length*8)-1);
console.assert(parseInt(height) == height,"输入的三角形数据数量有误");
return height;
}
/**
* 通过行数获取该行第一个元素在数组中的下标
* @param {[Number]} lineNo [行标,从0开始计]
* @return {[Number]} [数组下标]
*/
function getIndex_i(lineNo){
// if(lineNo == 0)
// return 0;
// return getIndex_i(lineNo-1)+lineNo;
//根据 f(n) = f(n-1)+n; f(0)=0 推到 f(n) = n(n+1)/2
return lineNo*(lineNo+1)/2;
}
function main(){
var TEMP = [2,3,4,6,5,7,4,1,8,9];
console.log(minimumTotal(TEMP))
}
DP问题练习1:数字三角最短路径问题的更多相关文章
- 「单调队列优化DP」P2034 选择数字
「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...
- Help Jimmy POJ - 1661 数字三角DP
题意:中文 https://vjudge.net/problem/POJ-1661 题解:设两个dp数组,dpl[i]存 从第i块板左边到地上所花的最短时间,dpr[i]存右边的. 将所有板按高度排序 ...
- ACM/ICPC 之 DP进阶(51Nod-1371(填数字))
原题链接:填数字 顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go ...
- 【OpenJudge9272】【DP】偶数个数字3
偶数个数字3 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB [描述] 在所有的N位数中,有多少个数中有偶数个数字3? [输入] 一行给出数字N,N&l ...
- dp算法之有代价的最短路径
题目:有代价的最短路径 题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值. 分析:用动态规划的思路来解决,每一点 ...
- (数位DP)51NOD 1042 数字0-9的数量
给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. 输入 ...
- HDU1176:免费馅饼(dp,数字三角形的应用)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176 这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右 ...
- 数字三角形 (DP入门)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...
- HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- Selenium 2自动化测试实战22(处理HTML5的视频播放)
一.处理HTML5的视频播放 大多数浏览器使用控件(如Flash)来播放视频,但是,不同的浏览器需要使用不同的插件.HTML5定义了一个新的元素<video>,指定了一个标准的方式来嵌入电 ...
- Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- 使用Navicat为Oracle新增用户
步骤请参考帖子https://www.cnblogs.com/franson-2016/p/5925593.html 需要注意的是新增用户时不能使用小写,否则不能登录,之前新增一个小写的用户名,授予c ...
- JavaScript(1):Base/Tips
目录 输出 全局变量 字符串 类型及转换 变量提升 严格模式 表单验证 (1) 输出 <!DOCTYPE html> <html> <body> <p> ...
- H3C 模拟器 防火墙开启Web功能
最近在搞运维的一些事情,由于缺少实体的机器来进行操作,先在模拟器里面进行 环境 windows 10,模拟器 HCL_V2.1.1 防火墙 1 在windows添加虚拟网卡 我的电脑--管理--设备管 ...
- JavaScript基础入门07
目录 JavaScript 基础入门07 BOM window对象 Navigator对象 Screen 对象 Location对象 History 对象 JavaScript 基础入门07 BOM ...
- Django模板系统-母板和继承
母板和继承 母版 html页面,提取多个页面的公共部分 定义多个block块,需要让子页面进行填充 <head> {% block page-css %} {% endblock %} & ...
- 【Python开发】urllib2.urlopen超时问题
原帖地址:http://hi.baidu.com/yss1983/item/933fbe45a09c43e01381da06 问题描述: 没有设置timeout参数,结果在网络环境不好的情况下 ...
- 【Linux开发】【DSP开发】Linux设备驱动之——PCI 总线
PCI总线概述 随着通用处理器和嵌入式技术的迅猛发展,越来越多的电子设备需要由处理器控制.目前大多数CPU和外部设备都会提供PCI总线的接口,PCI总线已成为计算机系统中一种应用广泛.通用的总线标准 ...
- Vue 项目结构介绍
Vue 项目创建完成后,使用 Web Storm 打开项目,项目目录如下: build 文件夹,用来存放项目构建脚本 config 中存放项目的一些基本配置信息,最常用的就是端口转发 node_mod ...