Submission #1215769

#TimeUsernameProblemLanguageResultExecution timeMemory
1215769ProtonDecay314Raisins (IOI09_raisins)C++20
100 / 100
275 ms29484 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<vvi> v3i;
typedef vector<v3i> v4i;
#define INF(dt) numeric_limits<dt>::max()
#define NINF(dt) numeric_limits<dt>::min()
#define pb push_back

int main() {

    int n, m;
    cin >> n >> m;

    vvi g(n + 1, vi(m + 1, 0));

    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cin >> g[i][j];
            g[i][j] += g[i][j - 1];
            g[i][j] += g[i - 1][j];
            g[i][j] -= g[i - 1][j - 1];
        }
    }

    v4i dp(n, v3i(m, vvi(n, vi(m, INF(int)))));

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            dp[i][j][i][j] = 0;
        }
    }

    for(int iw = 0; iw < n; iw++) {
        for(int jw = 0; jw < m; jw++) {
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    int i2 = i + iw, j2 = j + jw;

                    if(i2 >= n || j2 >= m) continue;
                    
                    int& ans = dp[i][j][i2][j2];

                    int cursum = g[i2 + 1][j2 + 1] - g[i][j2 + 1] - g[i2 + 1][j] + g[i][j];
                    
                    /*
                    row cut
                    */

                    for(int k = i; k < i2; k++) {
                        ans = min(ans, dp[k + 1][j][i2][j2] + dp[i][j][k][j2] + cursum);
                    }

                    /*
                    col cut
                    */

                    for(int k = j; k < j2; k++) {
                        ans = min(ans, dp[i][k + 1][i2][j2] + dp[i][j][i2][k] + cursum);
                    }
                }
            }
        }
    }

    cout << dp[0][0][n - 1][m - 1] << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...