vijosP1006 晴天小猪历险记之Hill

链接:https://vijos.org/p/1006

【思路】

图上DP。

这个题的递推顺序是关键。先从上一行得到最小值,然后从本行比较最小值,注意本行、本行与上一行之间的第一段与最后一段是相通的。

【代码】

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
 5 using namespace std;
 6
 7 const int maxn  = 1000+10;
 8 const int INF=1<<30;
 9
10 int w[maxn][maxn],d[maxn][maxn];
11 int n;
12
13 int main()
14 {
15      scanf("%d",&n);
16      FOR(i,1,n) FOR(j,1,i) scanf("%d",&w[i][j]);
17      memset(d,25,sizeof(d));
18      d[n][0]=0;
19      FOR(i,1,n) d[n][i]=d[n][i-1]+w[n][i];
20      for(int i=n-1;i;i--)
21      {
22          FOR(j,1,i) {
23              if(j==1)
24                  d[i][j]=min(d[i+1][i+1],min(d[i+1][j],d[i+1][j+1]))+w[i][j];
25              else if(j==i) {
26                   d[i][j]=min(d[i+1][1],min(d[i+1][j],d[i+1][j+1]))+w[i][j];
27              }
28              else
29                    d[i][j]=min(d[i+1][j],d[i+1][j+1]) + w[i][j];
30          }
31          d[i][1] = min(d[i][1],d[i][i]+w[i][1]);
32         FOR(j,2,i) d[i][j] = min(d[i][j],d[i][j-1] + w[i][j]);
33         for(int j=i-1;j;j--) d[i][j] = min(d[i][j],d[i][j+1] + w[i][j]);
34      }
35      printf("%d\n",d[1][1]);
36      return 0;
37 }
时间: 2024-08-09 06:24:07

vijosP1006 晴天小猪历险记之Hill的相关文章

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

背景 Background 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结…… 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇,要去采取这种药草.于是,晴天小猪的传奇故事便由此展开…… 描述 Description 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你

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

题目梗概 首先题目和数字三角形那道经典的DP题目描述一样,不过增加了两处不同: 1.同行之间可以相邻移动 2.位置(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)相邻. 思考 首先第一点我们只要在数字三角形的基础上,加上每行的移动就可以了. 但是第二点就要注意了,这样的描述使DP变成了环形. 具体的解释看这位大佬(Powde

VIjos 晴天小猪历险记之Number (搜索+链表hash)

背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难……终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它……晴天小猪一推开门,就发现那里……空无一人?但在屋中央有一个石桌,上面有一些字(强吧),最大的几个:如要见我,先过了这道关再说!晴天小猪定睛一看,终于发现桌上密密麻麻布满了字,费了九天二猪之力,终于将题目看完,大意是:为了维护世界的和平……我们需要让九位勇士组成一个3*3的阵型去屠龙,但是这个阵型的要求很奇特,要九个人按照强弱依次编号1~9,且阵型中每行.每

数字三角形合集

简单介绍 数字三角形这东西,出现了有一定的年头了.于是,出现了一些变种-- 眼下已知的题目 Codevs1220 数字三角形 这题是原版IOI1994啊-- f[i][j]=a[i][j]+max(f[i-1][j],f[i-1][j-1]). Codevs2193 数字三角形ww 和 Codevs2198 数字三角形www 改了.必须得经过一个点.而且2198是2193的数据规模上的加强版. 然而这并没有什么L用,仅仅需让必须经过的点的权值加上一个特别大的值,最后的结果再减去这个值即可了. 实

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

4 多表代替密码之Hill 密码_1 矩阵工具类

在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密,所以矩阵中的数字都是模26的值,比如:   *  = 这个地方结果就应该mod26, 最后结果就是: 那么上面两个相乘的矩阵就互为逆矩阵. 这个地方要多说一下密码学中的mod运算,数学中-5%26结果肯定是-5,但是这个地方我们取值只能在0-25之间,所以-5%26的结果应该是21. 求解一个方阵

javascript实现playfair和hill密码算法

时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. playfair Playfair密码(英文:Playfair cipher 或 Playfair square)是一种替换密码.依据一个5*5的正方形组成的密码表来编写,表中排列有25个字母.对于英语中的26个字母,去掉最常用的Z,构成密码表. 实现思路: 1,编制密码表 密钥是一个单词或词组,密码表

信息安全-2:python之hill密码算法[原创]

转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做,不过我觉得会加密就会解密的~~       一.hill算法原理 hill密码是一种多字母替代密码,由数学学Leste Hill于1929年研制成功.该密码算法取m个连续的明文字母,并用m个密文字母代替,用向量或矩阵表示为(这里取m=3,C和P是长度为3的列向量,K是3*3矩阵): 即:C=KP