제출 #5941

#제출 시각아이디문제언어결과실행 시간메모리
5941baneling100일도양단! (kriii1_1)C++98
1 / 1
0 ms3140 KiB
#include <stdio.h> #include <algorithm> using namespace std; int R, C, H, N, A[8][8][8][8][8][8], D[8][8][8][8][8][8]; void input(void) { int i, j, k, l, m, n, o, r, c, h; scanf("%d %d %d %d",&R,&C,&H,&N); for(i=1 ; i<=R ; i++) for(j=1 ; j<=C ; j++) for(k=1 ; k<=H ; k++) for(l=i ; l<=R ; l++) for(m=j ; m<=C ; m++) for(n=k ; n<=H ; n++) A[i][l][j][m][k][n]=D[i][l][j][m][k][n]=-1; for(i=1 ; i<=N ; i++) { scanf("%d %d %d",&r,&c,&h); A[r][r][c][c][h][h]=1; } } void makeA(int lr, int rr, int lc, int rc, int lh, int rh) { int i; for(i=lr ; i<=rr-1 ; i++) { if(A[lr][i][lc][rc][lh][rh]==-1) makeA(lr,i,lc,rc,lh,rh); if(A[i+1][rr][lc][rc][lh][rh]==-1) makeA(i+1,rr,lc,rc,lh,rh); if(A[lr][rr][lc][rc][lh][rh]<A[lr][i][lc][rc][lh][rh]+A[i+1][rr][lc][rc][lh][rh]) A[lr][rr][lc][rc][lh][rh]=A[lr][i][lc][rc][lh][rh]+A[i+1][rr][lc][rc][lh][rh]; } for(i=lc ; i<=rc-1 ; i++) { if(A[lr][rr][lc][i][lh][rh]==-1) makeA(lr,rr,lc,i,lh,rh); if(A[lr][rr][i+1][rc][lh][rh]==-1) makeA(lr,rr,i+1,rc,lh,rh); if(A[lr][rr][lc][rc][lh][rh]<A[lr][rr][lc][i][lh][rh]+A[lr][rr][i+1][rc][lh][rh]) A[lr][rr][lc][rc][lh][rh]=A[lr][rr][lc][i][lh][rh]+A[lr][rr][i+1][rc][lh][rh]; } for(i=lh ; i<=rh-1 ; i++) { if(A[lr][rr][lc][rc][lh][i]==-1) makeA(lr,rr,lc,rc,lh,i); if(A[lr][rr][lc][rc][i+1][rh]==-1) makeA(lr,rr,lc,rc,i+1,rh); if(A[lr][rr][lc][rc][lh][rh]<A[lr][rr][lc][rc][lh][i]+A[lr][rr][lc][rc][i+1][rh]) A[lr][rr][lc][rc][lh][rh]=A[lr][rr][lc][rc][lh][i]+A[lr][rr][lc][rc][i+1][rh]; } if(A[lr][rr][lc][rc][lh][rh]==-1) A[lr][rr][lc][rc][lh][rh]=0; } void init(void) { int i, j, k, l, m, n; for(i=1 ; i<=R ; i++) for(j=1 ; j<=C ; j++) for(k=1 ; k<=H ; k++) for(l=i ; l<=R ; l++) for(m=j ; m<=C ; m++) for(n=k ; n<=H ; n++) if(A[i][l][j][m][k][n]<=1) D[i][l][j][m][k][n]=(l-i+1)*(m-j+1)*(n-k+1); } void process(int lr, int rr, int lc, int rc, int lh, int rh) { int i; for(i=lr ; i<=rr-1 ; i++) { if(D[lr][i][lc][rc][lh][rh]==-1) process(lr,i,lc,rc,lh,rh); if(D[i+1][rr][lc][rc][lh][rh]==-1) process(i+1,rr,lc,rc,lh,rh); if(D[lr][rr][lc][rc][lh][rh]<min(D[lr][i][lc][rc][lh][rh],D[i+1][rr][lc][rc][lh][rh])) D[lr][rr][lc][rc][lh][rh]=min(D[lr][i][lc][rc][lh][rh],D[i+1][rr][lc][rc][lh][rh]); } for(i=lc ; i<=rc-1 ; i++) { if(D[lr][rr][lc][i][lh][rh]==-1) process(lr,rr,lc,i,lh,rh); if(D[lr][rr][i+1][rc][lh][rh]==-1) process(lr,rr,i+1,rc,lh,rh); if(D[lr][rr][lc][rc][lh][rh]<min(D[lr][rr][lc][i][lh][rh],D[lr][rr][i+1][rc][lh][rh])) D[lr][rr][lc][rc][lh][rh]=min(D[lr][rr][lc][i][lh][rh],D[lr][rr][i+1][rc][lh][rh]); } for(i=lh ; i<=rh-1 ; i++) { if(D[lr][rr][lc][rc][lh][i]==-1) process(lr,rr,lc,rc,lh,i); if(D[lr][rr][lc][rc][i+1][rh]==-1) process(lr,rr,lc,rc,i+1,rh); if(D[lr][rr][lc][rc][lh][rh]<min(D[lr][rr][lc][rc][lh][i],D[lr][rr][lc][rc][i+1][rh])) D[lr][rr][lc][rc][lh][rh]=min(D[lr][rr][lc][rc][lh][i],D[lr][rr][lc][rc][i+1][rh]); } } void output(void) { printf("%d",D[1][R][1][C][1][H]); } int main(void) { input(); makeA(1,R,1,C,1,H); init(); process(1,R,1,C,1,H); output(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...