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. python获取内存地址上存储的值

    在python中,可以通过id()这个方法来获取对象的内存地址. 但是反过来,怎么获取内存地址上存储的值? 先看一段代码: from ctypes import string_at from sys ...

  2. re 正则匹配的非贪婪匹配

    非贪婪匹配 将尽可能少的匹配内容,当?出现在其他的重复次数后面时会将贪婪模式改为非贪婪模式. ? 如 abc.*? abc.+? 非贪婪匹配:尽可能少的匹配{n,}?{,n}?{n,m}?*? # * ...

  3. centos7/redhat7安装mycli

    一.mycli介绍 MySQL的命令行客户端,可以执行自动完成和语法突出显示. 主页:http://mycli.net文档:http://mycli.net/docs github:https://g ...

  4. VIM全总结

    Vim是Linux自带的编辑器,是Vi的高级版,刚开始使用我是一脸懵逼的,跟普通的编辑器完全不同,基本全靠键盘,写完之后也不知道怎么保存,特地花了点时间了解了一下,还是挺简单的.其中,主要包含三种模式 ...

  5. elk 概念整理 集群状态 - yellow - 面试的问题 -- 官方配置文档 水平扩容以及数据保障

    1. primary shard   -- raid0 2.replicas shard -- raid1 3.index -- 图书馆的借书指引 4.MySQL vs elasticsearch # ...

  6. Laravel 里最简单的CURD套路

    控制器 namespace App\Http\Controllers; use App\Http\Requests\UserAddressRequest; use App\Models\UserAdd ...

  7. JCC指令

    0.JMP1.JE, JZ 结果为零则跳转(相等时跳转) ZF=12.JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=03.JS   结果为负则跳转   SF=14.JNS   结果为非负则 ...

  8. 结合docker做flask+kafka数据接口与压力测试

    一.需求 需要做实时数据接入的接口.数据最终要写入库,要做到高并发,数据的完整,不丢失数据. 二.技术选型 1.因为只是做简单的接口,不需要复杂功能,所以决定用flask这个简单的python框架(因 ...

  9. 终于搞懂了vue 的 render 函数(一) -_-|||

    终于搞懂了vue 的 render 函数(一) -_-|||:https://blog.csdn.net/sansan_7957/article/details/83014838 render: h ...

  10. Go语言中 Print,Println 和 Printf 的区别(八)

    Print 和 Println 这两个打印方式类似,只在格式上有区别 1. Println 打印的每一项之间都会有空行,Print 没有,例如: fmt.Println("go", ...