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:数字三角最短路径问题的更多相关文章

  1. 「单调队列优化DP」P2034 选择数字

    「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...

  2. Help Jimmy POJ - 1661 数字三角DP

    题意:中文 https://vjudge.net/problem/POJ-1661 题解:设两个dp数组,dpl[i]存 从第i块板左边到地上所花的最短时间,dpr[i]存右边的. 将所有板按高度排序 ...

  3. ACM/ICPC 之 DP进阶(51Nod-1371(填数字))

    原题链接:填数字 顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go ...

  4. 【OpenJudge9272】【DP】偶数个数字3

    偶数个数字3 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB [描述] 在所有的N位数中,有多少个数中有偶数个数字3? [输入] 一行给出数字N,N&l ...

  5. dp算法之有代价的最短路径

    题目:有代价的最短路径 题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值. 分析:用动态规划的思路来解决,每一点 ...

  6. (数位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次.   输入 ...

  7. HDU1176:免费馅饼(dp,数字三角形的应用)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176 这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右 ...

  8. 数字三角形 (DP入门)

    7 3     8 8     1     0 2     7     4     4  4     5     2     6     5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...

  9. HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others)     ...

随机推荐

  1. Statement、 PreparedStatement 、CallableStatement 区别和联系

    Statement. PreparedStatement .CallableStatement 区别和联系 1. Statement.PreparedStatement和CallableStateme ...

  2. java:nginx(java代码操作ftp服务器)

    1.检查是否安装了vsftpd [root@linux01 ~]# rpm -qa|grep vsftpd 2.安装vsftpd [root@linux01 ~]# yum -y install vs ...

  3. python中的set集合

    当使用爬虫URL保存时,一般会选择set来保存urls,set是集合,集合中的元素不能重复,其次还有交集,并集等集合的功能, 爬虫每次获取的网页中提取网页中的urls,并保存,这就需要利用urls = ...

  4. windows下sqlplus怎么连接远程oracle

    语法:sqlplus usr/pwd@//host:port/sid [oracle@mzl ~]$ sqlplus system/51411482@//192.168.21.11:1521/orcl ...

  5. react-redux provider组件

    provider组件概念图   react-redux provider组件概念图 provider组件的作用 provider包裹在根组件外层,使所有的子组件都可以拿到state.示例: impor ...

  6. Tensorflow 保存和载入训练过程

    本节涉及点: 保存训练过程 载入保存的训练过程并继续训练 通过命令行参数控制是否强制重新开始训练 训练过程中的手动保存 保存训练过程前,程序征得同意 一.保存训练过程 以下方代码为例: import ...

  7. C#编程 XML文档

    XML 指可扩展标记语言,XML 被设计用来传输和存储数据.XML 被设计用来结构化.存储以及传输信息. xml文档展示 <?xml version="1.0" encodi ...

  8. LeetCode.1154-一年中的第几天(Day of the Year)

    这是小川的第410次更新,第442篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第261题(顺位题号是1154).给定表示格式为YYYY-MM-DD的公历日期的字符串日期,返回 ...

  9. 使用torchvision下载数据集显示没有模板

    配置: Anaconda+Windows+py3.7 一:首先先卸载开始的torchvision:pip uninstall torchvision 二:找到官网:https://pypi.org/p ...

  10. PTA(Basic Level)1023.组个最小数

    给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就 ...