# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
5941 | baneling100 | 일도양단! (kriii1_1) | C++98 | 0 ms | 3140 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |