제출 #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...