Submission #787028

#TimeUsernameProblemLanguageResultExecution timeMemory
787028BlagojRaisins (IOI09_raisins)C++17
100 / 100
612 ms35232 KiB
#include <bits/stdc++.h>

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

using namespace std;

#define endl '\n'
#define ll long long
#define all(x) x.begin(), x.end()

ll mat[52][52], dp[52][52][52][52], prefSum[52][52];

ll calc(int x1, int y1, int x2, int y2) {
    x1--;
    y1--;
    return prefSum[x2][y2] - prefSum[x1][y2] - prefSum[x2][y1] + prefSum[x1][y1];
}

ll solve(int x1, int y1, int x2, int y2) {
    if (dp[x1][y1][x2][y2]) return dp[x1][y1][x2][y2];
    if (x1 == x2 && y1 == y2) return dp[x1][y1][x2][y2] = 0;
    ll ans = 10000000000;
    for (int i = x1; i < x2; i++) ans = min(ans, solve(x1, y1, i, y2) + solve(i + 1, y1, x2, y2) + calc(x1, y1, x2, y2));
    for (int j = y1; j < y2; j++) ans = min(ans, solve(x1, y1, x2, j) + solve(x1, j + 1, x2, y2) + calc(x1, y1, x2, y2));
    return dp[x1][y1][x2][y2] = ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        ll sum = 0;
        for (int j = 1; j <= m; j++) {
            cin >> mat[i][j];
            sum += mat[i][j];
            prefSum[i][j] = sum + prefSum[i - 1][j];
        }
    }
    cout << solve(1, 1, n, m);
}
#Verdict Execution timeMemoryGrader output
Fetching results...