jzoj P1338 【2011.12.10普及模拟】泽泽在埃及
来源:互联网 发布:单片机开发和java 编辑:程序博客网 时间:2024/06/11 22:35
题目描述
泽泽已52:0的比分输了球,被足球流氓打了一顿,扔进了窨井里……
出来的时候,泽泽已经在埃及了。
滚滚的黄沙在周围飞舞,没有一样生物在这里栖息。泽泽不想就挂在这里。忽然,泽泽被风沙遮住的眼睛瞥见了一座金字塔。这是一座很雄伟的金字塔,而且重要的是,金字塔顶端,竟然有一架直升飞机!
泽泽就像抓到了救命稻草,用他在长城上999999999999999999 mod 2倍的速度疯狂向金字塔奔跑。来到金字塔下,风把他刮进了金字塔。
门“轰隆隆”地关上了。泽泽看见里面陈列着很多珍品,但依然存在着暗器。但是还好,有个盗墓的把木乃伊给挖走了,所以在金字塔里没有跳动的僵尸。泽泽需要做的就是尽快跑向金字塔的顶端。
现在泽泽在金字塔最底层的左上角。他可以向前后左右或走到楼上去,但必须花费一点时间。一旦走到楼上后楼下的门就会关闭,泽泽不能回下去了,因此泽泽格外小心。幸运的是,金字塔很巧妙。在金字塔里有一些暗道,可以从某点直接通向某点,而不用再走最平常的路线,也是只能上不能下。泽泽知道这些暗道在哪里,而且知道走到每个地方的所花费的时间。
现在你要做的就是算出泽泽走到金字塔顶端所花最少的时间。
注意:
第n层第i行第j列我们表示成n,i,j。当n>=2时,n,i,j可以由4个位置走来(不包括暗道)。如3,1,1可以从2,1,1或2,1,2或2,2,1或2,2,2走来。
如图所示,一座大小为3的金字塔的俯视图就是这个样子的。从A(2,1,1)、B(2,1,2)、C(2,2,1)、D(2,2,2)都可以走到E(3,1,1)。其他位置依次类推。
输入
第1行为2个整数n,m。n表示金字塔的底部边长以及高,m表示有多少暗道。
接下来有n张正方形的图,每张图用一个回车隔开,表示从最底层到最高层的每个位置所花费的时间。保证上面的图的边长比下面图的多1。(如样例,这座大小为4的金字塔第1层是4*4的,第2层是3*3,第3层是2*2,第4层是1*1。)
接下来的m行,每行7个整数ai1,bi1,ci1,ai2,bi2,ci2,pi。表示第ai1层的第bi1行第ci1列到第ai2层的第bi2行第ci2列之间有一条时间为pi的暗道。保证ai1< ai2。
输出
一个整数,即泽泽走到金字塔顶端的最短时间。
样例输入
4 2
4 1 5 2
4 3 4 7
1 9 2 8
0 3 5 1
2 8 5
9 3 9
1 1 8
7 4
5 2
42
1 1 2 2 3 1 1
1 3 2 2 2 1 7
样例输出
52
数据范围限制
提示
【样例说明】
流程:
1 泽泽一开始在1,1,1的位置,总时间为0+4=4。
2 从1,1,1走到1,1,2,总时间为4+1=5。
3 走暗道到了2,3,1,总时间为5+1+1=7。
4 从2,3,1走到2,3,2,总时间为7+1=8。
5 再上楼到了3,2,2,总时间为8+2=10。
6 再上楼到了4,1,1,总时间为10+42=52。
【限制】
对于50%的数据,n<=5
对于100%的数据,n<=100,m<=50,每格的暗道总数不超过10个。
终于AC了……
题解:
DP+dfs:
1.读入时把x,y,z所对应的地道记录下来。
为了方便DP,我把顶端设为第一层,低端为最后一层。
2.因为第一层是从(N,1,1)开始的,而第一层不可能有第0层通往,所以先求出(N,1,1)到(N,X,Y)的最短距离。
2.逆推,每一层用DP推出由n-1层的点到n层的点的最小值。
f[n,x,y]:=min(f[n+1,x,y],f[n+1,x,y+1],f[n+1,x+1,y],f[n+1,x+1,y+1)+a[n,x,y]。
3.然后判断如果点(n,x,y)有t条地道通往的话就枚举T条地道到(n,x,y)的值,小于f[n,x,y]就进行更新。
4.f[n,x,y]有可能小于与他相邻的点f[n,x-1,y],f[n,x,y-1],f[x+1,y],f[n,x,y+1]加上a[n,x,y]的值,这时候就用到搜索,把全部能由相邻四个点影响而变小的点给更新。(注意判断越界情况)
var l:array [0..100,0..100,0..100,0..10,0..4] of longint; a,b,f:array [0..101,0..101,0..101] of longint; x1,x2,y1,y2,z1,z2,w,t,n,m,i,j,k:longint;procedure dfs(i,j,k:longint);begin if k-1>=1 then if f[i,j,k-1]>f[i,j,k]+a[i,j,k-1] then begin f[i,j,k-1]:=f[i,j,k]+a[i,j,k-1]; dfs(i,j,k-1); end; if j-1>=1 then if f[i,j-1,k]>f[i,j,k]+a[i,j-1,k] then begin f[i,j-1,k]:=f[i,j,k]+a[i,j-1,k]; dfs(i,j-1,k); end; if k+1<=i then if f[i,j,k+1]>f[i,j,k]+a[i,j,k+1] then begin f[i,j,k+1]:=f[i,j,k]+a[i,j,k+1]; dfs(i,j,k+1); end; if j+1<=i then if f[i,j+1,k]>f[i,j,k]+a[i,j+1,k] then begin f[i,j+1,k]:=f[i,j,k]+a[i,j+1,k]; dfs(i,j+1,k); end;end;function min(a,b:longint):longint;begin if a>b then exit(b); exit(a);end;begin assign(input,'egypt.in'); assign(output,'egypt.out'); reset(input); rewrite(output); readln(n,m); for i:=n downto 1 do for j:=1 to i do begin for k:=1 to i do read(a[i,j,k]); readln; end; for i:=1 to m do begin readln(x1,y1,z1,x2,y2,z2,w); x1:=n-x1+1; x2:=n-x2+1; inc(b[x2,y2,z2]); l[x2,y2,z2,b[x2,y2,z2],1]:=x1; l[x2,y2,z2,b[x2,y2,z2],2]:=y1; l[x2,y2,z2,b[x2,y2,z2],3]:=z1; l[x2,y2,z2,b[x2,y2,z2],4]:=w; end; f[n,1,1]:=a[n,1,1]; for i:=2 to n do begin f[n,i,1]:=f[n,i-1,1]+a[n,i,1]; f[n,1,i]:=f[n,1,i-1]+a[n,1,i]; end; for i:=2 to n do for j:=2 to n do f[n,i,j]:=min(f[n,i-1,j],f[n,i,j-1])+a[n,i,j]; for i:=1 to n do for j:=1 to n do dfs(n,i,j); for i:=n-1 downto 1 do begin for j:=1 to i do for k:=1 to i do begin f[i,j,k]:=min(min(f[i+1,j,k],f[i+1,j,k+1]),min(f[i+1,j+1,k],f[i+1,j+1,k+1]))+a[i,j,k]; for t:=1 to b[i,j,k] do f[i,j,k]:=min(f[i,j,k],f[l[i,j,k,t,1],l[i,j,k,t,2],l[i,j,k,t,3]]+l[i,j,k,t,4]+a[i,j,k]); end; for j:=1 to i do for k:=1 to i do dfs(i,j,k); end; writeln(f[1,1,1]); close(input); close(output);end.
- jzoj P1338 【2011.12.10普及模拟】泽泽在埃及
- jzoj P1135 【2011.12.10普及模拟】泽泽在中国
- jzoj P1336 【2011.12.10普及模拟】泽泽在英国
- jzoj P1337 【2011.12.10普及模拟】泽泽在巴西
- 2017.03.04【NOIP 普及组】模拟赛C组 T4:泽泽在埃及
- 泽泽在巴西(jzoj普及组模拟第三题)(超难)
- jzoj 1359. 【2011.12普及模拟】数三角
- jzoj 1350. 【2011.12.17普及模拟】流星雨
- jzoj 1570. 【普及模拟】射击
- jzoj 1571. 【普及模拟】过河
- jzoj 1579. 【普及模拟】老鼠
- jzoj 1589. 【普及模拟】洗牌
- jzoj 1591. 【普及模拟】游戏
- jzoj P1508【普及模拟】蚂蚁
- jzoj P1507【普及模拟】数列
- jzoj P1510【普及模拟】剪草
- 【普及模拟】数列 (jzoj)
- jzoj P1509【普及模拟】单元格
- 面试-测试开发如何考察-应届生
- xcode中查看ios sdk版本
- 算法训练 6-1 递归求二项式系数值
- Windows8.1+vs2013+opencv2.4.9环境配置
- Cheerleaders UVA
- jzoj P1338 【2011.12.10普及模拟】泽泽在埃及
- hdu 1155 Bungee Jumping(物理题——能量守恒)
- 使用WebStorm上传本地项目到GitHub
- poj 3233 Matrix Power Series
- 递归 车票找零 组合数
- bootstrap select multiple
- sdut 1008 最大公共子串(求n个字符串的最长公共子串)lcs
- andriod studio的安装
- 错题总结