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.
1 0
原创粉丝点击