Submission #1204211

#TimeUsernameProblemLanguageResultExecution timeMemory
1204211NewtonabcRaisins (IOI09_raisins)C++20
100 / 100
579 ms26088 KiB
#include<bits/stdc++.h>
using namespace std;
int a[60][60],qs[60][60],dp[51][51][51][51];
int f(int a,int b,int c,int d){
    if(dp[a][b][c][d]!=-1) return dp[a][b][c][d];
    if(a==c && b==d) return dp[a][b][c][d]=0;
    int mn=INT_MAX,now=qs[c][d]-qs[a-1][d]-qs[c][b-1]+qs[a-1][b-1];
    for(int x=b;x<d;x++){
        mn=min(mn,f(a,b,c,x)+f(a,x+1,c,d)+now);
    }
    for(int x=a;x<c;x++){
        mn=min(mn,f(a,b,x,d)+f(x+1,b,c,d)+now);
    }
    return dp[a][b][c][d]=mn;
}
int main(){
    int n,m;
    cin>>n >>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            qs[i][j]=qs[i-1][j]+qs[i][j-1]-qs[i-1][j-1]+a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int x=1;x<=n;x++){
                for(int y=1;y<=m;y++){
                    dp[i][j][x][y]=-1;
                }
            }
        }
    }
    int ret=f(1,1,n,m);
    cout<<ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...