Submission #1198877

#TimeUsernameProblemLanguageResultExecution timeMemory
1198877AMel0nRaisins (IOI09_raisins)C++20
100 / 100
417 ms29512 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first 
#define S second

int N, M;
vector<vector<vector<vector<int>>>> dp;
vector<vector<int>> ras;

int solve(int a, int b, int c, int d) {
    if (a == b && c == d) return 0;
    if (dp[a][b][c][d] != INT_MIN) return dp[a][b][c][d];
    int mn = 1e8;
    for(int i = a; i < b; i++) mn = min(mn, solve(a, i, c, d) + solve(i + 1, b, c, d));
    for(int i = c; i < d; i++) mn = min(mn, solve(a, b, c, i) + solve(a, b, i + 1, d));
    return dp[a][b][c][d] = mn + ras[b+1][d+1] - ras[b+1][c] - ras[a][d+1] + ras[a][c];
}

signed main() {
    cin.tie(0); ios::sync_with_stdio(false);
    cin >> N >> M;
    ras.resize(N+1, vector<int>(M+1));
    dp.resize(N, vector<vector<vector<int>>>(N, vector<vector<int>>(M, vector<int>(M, INT_MIN))));
    FOR(r, N) {
        FOR(c, M) {
            cin >> ras[r+1][c+1];
            ras[r+1][c+1] += ras[r][c+1] + ras[r+1][c] - ras[r][c];
        }
    }

    cout << solve(0,N-1,0,M-1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...