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. etcd三节点安全集群搭建-pki安全认证

    etcd安全集群搭建就是 pki安装认证 1.环境: 三台centos7. 主机 192.168.0.91 192.168.0.92 192.168.0.93 都关闭防火墙 都关闭selinux 配置 ...

  2. python-Web-django-图片上传

    建路由 创建方法 渲染页面 下载plupload插件.将插件放在项目根目录下的static下 写页面,引入js,写html 这个容器:放上传的图片 当上传后,需要ul里放3要素: 元素1:隐藏Inpu ...

  3. Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  4. meta viewport移动端自适应

    参考链接:https://www.jianshu.com/p/561357d7cd7b

  5. ctype.h头文件

    定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符.控制字符等等.既支持单字节(Byte)字符,也 ...

  6. Emgu 学习(2) 视频文件播放

    播放AVI视频文件 static void Main(string[] args) { CvInvoke.NamedWindow("TestVideo", NamedWindowT ...

  7. 牛客小白月赛14 -G (筛法)

    题目链接:https://ac.nowcoder.com/acm/contest/879/G 题意:给定A1和A数组公式: 以及B数组: 求 思路:利用筛法更新b数组,最后求异或和即可. AC代码: ...

  8. HttpClient常用方法总结

    1.HttpPost发送表单请求 String url = ""; HttpPost httpPost = new HttpPost(url); List<NameValue ...

  9. Redis 以及 Python操作Redis

    Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...

  10. Luogu P4878 [USACO05DEC]布局

    题目 差分约束模板. 注意判负环需要建一个超级源点到每个点连一条\(0\)的边.因为\(1\)不一定能到达所有的点. #include<bits/stdc++.h> #define pi ...