背景

在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结……
不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……

描述

这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。

山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走。山是环形的。(**注意**:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。

晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。

★★★**本题为vijos早年陈题,描述晦涩,现重新描述题面如下**★★★
有一个数字三角形,共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

样例输出1

10

限制

各个测试点1s

提示

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

来源

Sunnypig

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <memory.h>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 int mou[1001][1001]={0},f[1001][1001]={0};
 8
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++)
14         for(int j=0;j<i;j++)
15             scanf("%d",&mou[i][j]);
16     f[1][0]=mou[1][0];
17     //先从上往下走算出最小值
18     for(int x=2;x<=n;x++)
19     {
20         for(int y=0;y<x;y++)
21             f[x][y]=min(f[x-1][(y-2+x)%(x-1)],f[x-1][y%(x-1)])+mou[x][y];
22         //再分别从左和右推一遍最小值
23         for(int y=0;y<x;y++)
24             f[x][y]=min(f[x][y],f[x][(y-1+x)%x]+mou[x][y]);
25         for(int y=x-1;y>=0;y--)
26             f[x][y]=min(f[x][y],f[x][(y+1)%x]+mou[x][y]);
27         //二遍推(感觉应该需要但好像不要也能过??不懂为啥)
28         for(int y=0;y<x;y++)
29             f[x][y]=min(f[x][y],f[x][(y-1+x)%x]+mou[x][y]);
30         for(int y=x-1;y>=0;y--)
31             f[x][y]=min(f[x][y],f[x][(y+1)%x]+mou[x][y]);
32     }
33     printf("%d\n",f[n][0]);
34     return 0;
35 }

View Code

一开始搞错了顺序 从下往上推了T^T然而那样的话就完全不对了……

所以导致数组顺序安排改来改去的最后设成了从0开始存数字非常不方便

最后总算是debug对了

未解决的问题由于一开始是由下往上推所以算了从起点到最后一行所有数所用的最小时间,后来改为由上而下之后就没把这个去掉直接用了 按理来说在最后一行也只有往左走往右走一条路 只要加上这两条路中较小的时间花费就可以了 为什么wa了一部分数据呢??

错误代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <memory.h>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 int mou[1001][1001]={0},f[1001][1001]={0};
 8
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++)
14         for(int j=0;j<i;j++)
15             scanf("%d",&mou[i][j]);
16     f[1][0]=mou[1][0];
17     //第n行的情况
18     f[n][0]=mou[n][0];
19     for(int y=1;y<n;y++)
20     {
21         int r=mou[n][0],l=mou[n][0];
22         for(int i=1;i<=y;i++)
23             r+=mou[n][i];
24         for(int i=n-1;i>=y;i--)
25             l+=mou[n][i];
26         f[n][y]=r<l?r:l;
27     }
28     //其他行的情况
29     //先从上往下走算出最小值
30     for(int x=2;x<=n-1;x++)
31     {
32         for(int y=0;y<x;y++)
33             f[x][y]=min(f[x-1][(y-2+x)%(x-1)],f[x-1][y%(x-1)])+mou[x][y];
34         //再分别从左和右推一遍最小值
35         for(int y=0;y<x;y++)
36             f[x][y]=min(f[x][y],f[x][(y-1+x)%x]+mou[x][y]);
37         for(int y=x-1;y>=0;y--)
38             f[x][y]=min(f[x][y],f[x][(y+1)%x]+mou[x][y]);
39         //二遍推(感觉应该需要但好像不要也能过??不懂为啥)
40         for(int y=0;y<x;y++)
41             f[x][y]=min(f[x][y],f[x][(y-1+x)%x]+mou[x][y]);
42         for(int y=x-1;y>=0;y--)
43             f[x][y]=min(f[x][y],f[x][(y+1)%x]+mou[x][y]);
44     }
45     int min0=999999;
46     for(int y=0;y<n;y++)
47     {
48         f[n][y]=min(f[n-1][(y-1+n)%(n-1)],f[n-1][y%(n-1)])+f[n][y];
49         if(y==0)
50             min0=f[n][y];
51         if(min0>f[n][y])
52             min0=f[n][y];
53     }
54     printf("%d\n",min0);
55     return 0;
56 }

View Code

转载于:https://www.cnblogs.com/yalphait/p/8515698.html

18.03.06 vijos1006 晴天小猪历险记之Hill相关推荐

  1. [DP][vijos1006]晴天小猪历险记之Hill

    题目梗概 首先题目和数字三角形那道经典的DP题目描述一样,不过增加了两处不同: 1.同行之间可以相邻移动 2.位置(i,j)(i,j),它与(i-1,j-1)(i−1,j−1)以及(i-1,j)(i− ...

  2. vijosP1006 晴天小猪历险记之Hill

    vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...

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

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

  4. 晴天小猪历险记之Hill

    题目描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求 ...

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

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

  6. P1006晴天小猪历险记之Hill

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

  7. voj1006 晴天小猪历险记之Hill

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

  8. 回档|晴天小猪历险记之hill

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

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

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

最新文章

  1. bzoj 1064 图论
  2. 深度学习正改变物理系统模拟,速度最高提升20亿倍那种
  3. DRV8711的使用,堵转stall检测的使用及衰减模式
  4. python基础教程书籍推荐-小猿圈推荐Python入门书籍,不知道这些你就太low了。
  5. Java设计模式(十三):代理设计模式
  6. 不合理的指标【转载】
  7. Java RSA加密(一)--BCD输出
  8. SSO之CAS单点登录实例演示
  9. ORM的个人简单理解以及持久化和持久层的简单理解、Hibernate的简单理解,mybatis 的好处通俗易懂
  10. 如何在虚拟机安装windows server 2003
  11. dnf服务器字幕乱码win10系统,主编帮你win10系统玩dnf字体模糊的方案
  12. Houdini10:灯光
  13. Channel Splitting Network for Single MR Image Super-Resolution医学图像超分阅读笔记
  14. 广东工业大学计算机专业分流,2017年广东工业大学大类招生学生专业分流工作小组...
  15. 激光三角测量物体高度
  16. OTP:Java一次动态密码、付款码原理
  17. 我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer,原来大厂都是从这几个方面问问题
  18. 顺丰java_顺丰API调用java版
  19. 灰度共生矩阵及matlab实现
  20. MacOs卸载Adobe后还有残留进程的解决方法

热门文章

  1. 国产商用密码算法简介
  2. powerpc 汇编linux,powerpc e500系列,linux初始化的tlb汇编,添加人肉代码注释
  3. 公司间交易STO方式
  4. 中文影评分类的神经网络模型
  5. 【深夜福利】程序员到底怎么找对象?资深媒婆阿姨有奇招
  6. 哪种女子才是男人最想要的?
  7. 关于C语言数据基本类型的Signed和Unsigned的理解
  8. 零基础可以报考中级经济师吗?需要准备多久?
  9. eclipse 的validating长时间卡住不动
  10. tcp 错误代码 10061: 由于目标计算机积极拒绝,无法连接.,错误号10061:无法建立连接,因为目标计算机主动拒绝它(客户端-服务器)...