Submission #18057

#TimeUsernameProblemLanguageResultExecution timeMemory
18057chan492811L 모양의 종이 자르기 (KOI15_cut)C++98
25 / 25
336 ms27520 KiB
#include <cstdio>
#include <cstring>
#include <algorithm>
#define n 50
#define INF 1000000000
using namespace std;
int l_paper[51][51][51][51],rec[51][51];
int h1,w1,h2,w2;
int main(){
    int i,j,k,l,p;
    scanf("%d %d %d %d",&h1,&w1,&h2,&w2);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            rec[i][j]=INF;
            if(i==1 || j==1){ rec[i][j]=max(i,j); continue; }
            if(i==j){ rec[i][j]=1; continue; }
            for(k=1;k<i;k++) rec[i][j]=min(rec[i][j],rec[k][j]+rec[i-k][j]);
            for(k=1;k<j;k++) rec[i][j]=min(rec[i][j],rec[i][k]+rec[i][j-k]);
        }
    }
    for(i=1;i<=h1;i++){
        for(j=1;j<=w1;j++){
            for(k=1;k<i;k++){
                for(l=1;l<j;l++){
                    l_paper[i][j][k][l]=INF;
                    l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[k][j-l]+rec[i-k][j]);
                    l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[i-k][l]+rec[i][j-l]);
                    for(p=1;p<j-l;p++) l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[p][i]+l_paper[i][j-p][k][l]);
                    for(p=1;p<l;p++) l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[p][i-k]+l_paper[i][j-p][k][l-p]);
                    for(p=1;p<k;p++) l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[p][j-l]+l_paper[i-p][j][k-p][l]);
                    for(p=1;p<i-k;p++) l_paper[i][j][k][l]=min(l_paper[i][j][k][l],rec[p][j]+l_paper[i-p][j][k][l]);
                }
            }
        }
    }printf("%d",l_paper[h1][w1][h2][w2]);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...