Submission #18862

#TimeUsernameProblemLanguageResultExecution timeMemory
18862NamnamseoL 모양의 종이 자르기 (KOI15_cut)C++14
25 / 25
232 ms34128 KiB
#include <cstdio>

int rectdp[51][51];
bool rectc[51][51];

int min(int a,int b){ return a>b?b:a; }

int rect(int w,int h){
    if(w==h) return 1;
    if(rectc[w][h]) return rectdp[w][h];
    rectc[w][h]=1;
    int& ret=rectdp[w][h];
    ret=1e9;
    int i;
    for(i=1; i<w; ++i) ret=min(ret, rect(i,h)+rect(w-i,h));
    for(i=1; i<h; ++i) ret=min(ret, rect(w,i)+rect(w,h-i));
    return ret;
}

bool chk[51][51][51][51];
int   dp[51][51][51][51];

int work(int a,int b,int c,int d){
    if(a==c) {
        if(b==d) return 1;
        else return rect(a, b-d);
    } else if(b==d){
        return rect(a-c,b);
    } else {
        int& ret=dp[a][b][c][d];
        if(chk[a][b][c][d]) return ret;
        chk[a][b][c][d]=1;
        ret=2e9;
        int i;
        for(i=1; i<=a-c; ++i) ret=min(ret, rect(i,b)+work(a-i,b,c,d));
        for(i=1; i<=b-d; ++i) ret=min(ret, rect(a,i)+work(a,b-i,c,d));
        for(i=1; i<c  ; ++i) ret=min(ret, rect(i,b-d)+work(a-i,b,c-i,d));
        for(i=1; i<d  ; ++i) ret=min(ret, rect(i,a-c)+work(a,b-i,c,d-i));
        return ret;
    }
}

int main()
{
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    printf("%d\n",work(a,b,c,d));
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...