Submission #1219278

#TimeUsernameProblemLanguageResultExecution timeMemory
1219278edga1Raisins (IOI09_raisins)C++20
100 / 100
451 ms30216 KiB
#include <bits/stdc++.h>

using namespace std;

#define FIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define pb push_back
#define fi first
#define se second

const int N = 55;
const ll MOD = 1e9 + 7;
const ll INF = 1e9;

int r[N][N];
int dp[N][N][N][N];

int cut(int x1, int y1, int x2, int y2){
    if(x1==x2 && y1==y2) return 0;
    if(dp[x1][y1][x2][y2]!=-1) return dp[x1][y1][x2][y2];
    int b=INF;
    for(int i=x1; i<x2; i++){
        b=min(b,cut(x1,y1,i,y2)+cut(i+1,y1,x2,y2));
    }
    for(int i=y1; i<y2; i++){
        b=min(b,cut(x1,y1,x2,i)+cut(x1,i+1,x2,y2));
    }
    dp[x1][y1][x2][y2]=b+r[x2][y2]+r[x1-1][y1-1]-r[x2][y1-1]-r[x1-1][y2];
    return dp[x1][y1][x2][y2];
}

int main(){
    FIO;
    int n,m;
    cin>>n>>m;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cin>>r[i][j];
            r[i][j]+=r[i-1][j]+r[i][j-1]-r[i-1][j-1];
        }
    }
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            for(int i2=1; i2<=n; i2++){
                for(int j2=1; j2<=m; j2++){
                    dp[i][j][i2][j2]=-1;
                }
            }
        }
    }
    cout<<cut(1,1,n,m);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...