有一个数字三角形,共nn行,依次编号为第一行,第二行至第nn行。其中第ii行有ii个数字,位置依次记为(i,1),(i,2)(i,1),(i,2)到(i,i)(i,i)。
现在从第nn层的第一个位置出发(即(n,1)(n,1)),每一步移到相邻的,且行编号小于或等于当前行编号的一个位置中,直到(1,1)(1,1)结束,在不重复经过任何位置的情形下,路过的所有位置(包括端点)的对应数字之和最小。

下面详细定义相邻关系。
同一层内连续的两个位置相邻,特别的有每一层第一个位置与最后一个位置相邻。
对于位置(i,j)(i,j),它与(i-1,j-1)(i−1,j−1)以及(i-1,j)(i−1,j)相邻,特别的(i,1)(i,1)与(i-1,i-1)(i−1,i−1)相邻,且(i,i)(i,i)与(i-1,1)(i−1,1)相邻。

格式

输入格式

第一行有一个数n(2<=n<=1000),表示山的高度。

从第二行至第n+1行,第i+1行有i个数,每个数表示晴天小猪在这一段山路上需要爬的时间。

输出格式

一个数,即晴天小猪所需要的最短时间。

样例1

样例输入1

5
1
2 3
4 5 6
10 1 7 8
1 1 4 5 6
Copy

样例输出1

10
Copy

限制

各个测试点1s

提示

在山的两侧的走法略有特殊,请自己模拟一下,开始我自己都弄错了……

思路:

输入的是一个n行,第i行有i个数的数字三角形。个人比较喜欢举个具体的例子进行分析。如下:

1

2    3

4   5   6

7   8   9   10

11   12   13   14   15

为一个5行的数字三角形。

其可能行走的路线是,向左,向右,斜向上,斜向下,而特殊点(即边界点)对应的斜上方可以到上一行的另一边。

例如:5可以到4,6,2,3;11可以到12,15,7,10;

一般化则为a[i][j]可以向a[i][j-1],a[i][j+1],a[i-1][j-1],a[i-1][j]位置走。

临界处:a[i][1]可以向a[i][2],a[i][i],a[i-1][1],a[i-1][i-1]位置走;a[i][i]同理。

我们从上往下推,如果走到a[i][j]此时是最短的,那么之前的路程都是最短的。

所以我们可以以顶点为起点,计算到达底部各点的最短距离。

#include <iostream>using namespace std;int main()
{int num;cin>>num;int ang[num+1][num+1];int f[num+1][num+1];for(int i=1;i<=num;i++)for(int j=1;j<=i;j++)cin>>ang[i][j];f[1][1]=ang[1][1];    //以此为起点for(int i=2;i<=num;i++){for(int j=2;j<i;j++)f[i][j]=min(f[i-1][j-1],f[i-1][j])+ang[i][j];  //计算上一层到这一层的最短距离f[i][1]=min(f[i-1][i-1],f[i-1][1])+ang[i][1];  f[i][i]=min(f[i-1][i-1],f[i-1][1])+ang[i][i];  //剔除特别点for(int j=2;j<=i;j++)f[i][j]=min(f[i][j],f[i][j-1]+ang[i][j]);  //从左到右计算同一层最短距离f[i][1]=min(f[i][1],f[i][i]+ang[i][1]);for(int j=i-1;j>=1;j--)f[i][j]=min(f[i][j],f[i][j+1]+ang[i][j]);f[i][i]=min(f[i][i],f[i][1]+ang[i][i]);   //从右到左计算同一层最短距离}cout<<f[num][1];return 0;
}

Vijos 1006相关推荐

  1. vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化

    题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...

  2. Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  3. 【vijos】1006 晴天小猪历险记之Hill(dijkstra)

    https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...

  4. vijos 1476 旅游规划题解

    题目链接:https://vijos.org/p/1476 解:因为这一定是一棵树,所以我们多画几次图,就会发现所有的最长路径中心点都一样,且中心点把这条最长路径分成两段等长的路. 那么做法就很简单啦 ...

  5. Vijos P1848 记数问题【进制】

    描述 试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1.2.3.4.5.6.7.8.9.10.11 中,数字 1 出现了 4 ...

  6. Vijos P1131 最小公倍数和最大公约数问题【暴力】

    最小公倍数和最大公约数问题 描述 输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P.Q的个数. 条件:1.P.Q是正整数 2.要求P.Q以xO为最大公 ...

  7. 【中国剩余定理】POJ 1006 HDU 1370 Biorhythms

    题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...

  8. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--, ...

  9. poj 1006 生理周期

    题目链接:http://poj.org/problem?id=1006 题意:中文题. 中国剩余定理: 1 #include <cstdio> 2 #include <cmath&g ...

  10. Vijos p1165 火烧赤壁 离散化+单调栈

    题目链接:https://vijos.org/p/1165 题意:输入n(n <= 20,000)段线段的端点,问所有线段的长度总和为多少? input: 3 -1 1 5 11 2 9 out ...

最新文章

  1. Apache漏洞修复
  2. brave浏览器_Brave浏览器基础使用教程,同时如何通过Brave获取BAT奖励
  3. mysql+两行+一样+筛选_MySQL计算相邻两行某列差值的方法
  4. dds设计信号发生器
  5. 电子计算机和多媒体教材分析,电子计算机多媒体教学设计模板
  6. 【我的物联网成长记9】物联网平台安全如何破?
  7. python自动化测试报告 之 allure_Pytest+ Allure + Jenkins 自动化测试报告
  8. HoloLens开发手记 - 使用HoloLens模拟器 Using HoloLens emulator
  9. 打开*.gd文件的方法
  10. 多元统计分析假设检验
  11. 抱米花-豆丁文档下载器 20100529
  12. html代码中数学公式,html中使用mathjax数学公式
  13. 【机器学习应用】机器学习之有监督学习
  14. Oracle10g或Oracle11g完全卸载正确步骤(亲身体验-详细图文教程)
  15. MindSpore21天实战营(2):基于BERT实现中文新闻分类实战
  16. vue开发公众号-关闭浏览器返回主公众号
  17. 奔腾的芯——英特尔公司
  18. Java微信公众号开发(附源码!!!)
  19. Celery介绍--手机短信异步发送
  20. 玩转华为ENSP模拟器系列 | 配置OSPF多进程

热门文章

  1. 软件工程基础-个人项目-数独的生成与求解
  2. zbbz加载成功用不了_cad加载应用程序不能加载
  3. matlab2020面板介绍
  4. 11(0)-AirSim+四旋翼仿真-人工势场法避障
  5. 加快pip下载的速度---镜像
  6. ASP.NET MVC diyUpload上传文件!
  7. Java三种方法实现字符串排序
  8. 【数据融合】基于DS证据理论实现数据融合附matlab代码
  9. OLED 12864屏幕指南
  10. mtk添加更换华大北斗gps驱动