【2011.12.10普及模拟】泽泽在埃及题解

题目描述
泽泽已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层是44的,第2层是33,第3层是22,第4层是11。)

接下来的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个。

题解:

全场最难题,有很多方法但我选择了DP+记忆化搜索
a a ai,j,k 表示从(x,x,x)到(i,j,k)所花费的时间(如题所示);
f f fi,j,k 表示从(1,1,1)到(i,j,k)所花费的时间;
暗道用邻接表存储(有大佬用了前向星)。
f f fi,j,k可以从 f f fi-1,j,k f f fi-1,j+1,k f f fi-1,j,k+1 f f fi-1,j+1,k+1和暗道更新,还可以从同一层更新(这就可以用记忆化搜索dfs,听说有人用了DP)。

记忆化搜索代码:

void dfs(int o,int x,int y){
    
    
	for(int i=0;i<4;i++){
    
    
		int xx=x+way[i][0];
		int yy=y+way[i][1];
		if(f[o][x][y]+a[o][xx][yy]<f[o][xx][yy]&&xx>=1&&xx<=n-o+1&&yy>=1&&yy<=n-o+1){
    
    
			f[o][xx][yy]=f[o][x][y]+a[o][xx][yy];
			dfs(o,xx,yy);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/zhy_Learn/article/details/107499495