2016.7.15_模拟赛t1 立方体

来源:互联网 发布:淘宝图片版权怎么看 编辑:程序博客网 时间:2024/05/23 13:23

NOIP模拟 立方体

题目

题目の描述
这里写图片描述
input
这里写图片描述
sample input
e2 e3 0 8 1 2 1 1
output
这里写图片描述
sample output
5
Data Constraint
这里写图片描述

思路の分析

看到数据范围,第一反应当然是萌萌的爆搜,但是这题暴力复杂度O(2q)q,而且比正解还难打233
然而很多状态都是没有用的,于是我们想到了DP,设F[I,J,X,Y,Z]表示当前的位置在(x,y),当前“色子”的前面是X,下面是Y,右面是Z。(这样就可以表示出六个位子对应的数了)
一个状态显然只与ta的上一步有关~那么我们可以开滚动数组
F[I,J,X,Y,Z]可以由4种状态转化而来,分别是:
f[i-1,j,b[y],x,z]+a[y]
f[i+1,j,y,b[x],z]+a[y]
f[i,j-1,x,b[z],y]+a[y]
f[i,j+1,x,z,b[y]]+a[y]
其中b[X]表示与X相对的那个面的编号


贴代码:

var    f,g:array[0..9,0..9,0..6,0..6,0..6]of longint;    a,b:array[0..6]of longint;    i,j,k,l,n,r,c,t1,t2,t3,t4,t5,x,y,z,ans,o:longint;    ch1,ch2,ch3,ch4:char;function min(x,y:longint):longint;begin    if x<y then exit(x) else exit(y);end;begin    read(ch1);    read(ch2);    read(ch3);    read(ch3);    read(ch4);    for i:=1 to 6 do read(a[i]);    readln;    t1:=ord(ch1)-96;    t2:=ord(ch2)-48;    t3:=ord(ch3)-96;    t4:=ord(ch4)-48;    t5:=t1;    t1:=t2;    t2:=t5;    t5:=t3;    t3:=t4;    t4:=t5;    fillchar(f,sizeof(f),$7f div 3);    fillchar(g,sizeof(g),$7f div 3);    f[t1,t2,1,5,4]:=0;    b[1]:=2;    b[2]:=1;    b[3]:=5;    b[4]:=6;    b[5]:=3;    b[6]:=4;    ans:=1314520;    for o:=1 to 64 do    begin        for i:=1 to 8 do            for j:=1 to 8 do                for x:=1 to 6 do                    for y:=1 to 6 do                        for z:=1 to 6 do                        begin                            g[i,j,x,y,z]:=min(f[i-1,j,b[y],x,z]+a[y],f[i+1,j,y,b[x],z]+a[y]);                            g[i,j,x,y,z]:=min(g[i,j,x,y,z],f[i,j-1,x,b[z],y]+a[y]);                            g[i,j,x,y,z]:=min(g[i,j,x,y,z],f[i,j+1,x,z,b[y]]+a[y]);                        end;        for x:=1 to 6 do            for y:=1 to 6 do                for z:=1 to 6 do                    ans:=min(ans,g[t3,t4,x,y,z]);        f:=g;    end;    writeln(ans+a[5]);end.

(好丑(有型)啊)

0 0
原创粉丝点击