Submission #1214936

#TimeUsernameProblemLanguageResultExecution timeMemory
1214936harvsftwRaisins (IOI09_raisins)C++20
10 / 100
153 ms34568 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;

#define F(i, n) for(int i = 0; i < (n); i++)
#define FF(i, s, n) for(int i = s; i < (n); i++)
#define F_reverse(i, n) for(int i = (n) - 1; i >= 0; i--)
#define dcout if(0) cout
#define N 50 + 1

int64_t grid[N][N];
int64_t grid_sum[N][N];
int64_t dp[N][N][N][N];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

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

    F(i, n) {
        F(j, m) {
            cin >> grid[i][j];

            grid_sum[i][j] = grid[i][j];
            if(j > 0) {
                grid_sum[i][j] += grid_sum[i][j - 1];
            }
        }
        if(i > 0) {
            F(j, m) {
                grid_sum[i][j] += grid_sum[i - 1][j];
            }
        }

        // F(j, m) {
        //     cout << grid_sum[i][j] << ' ';
        // }
        // cout << endl;
    }

    FF(h, 1, n + 1) {
        FF(w, 1, m + 1) {
            if(h == 1 && w == 1) {
                continue;
            }
            
            F(r, n - h + 1) {
                F(c, m - w + 1) {
                    int64_t cost = grid_sum[r + h - 1][c + w - 1];
                    if(r > 0) {
                        cost -= grid_sum[r - 1][c + w - 1];
                    }
                    if(c > 0) {
                        cost -= grid_sum[r + h - 1][c - 1];
                    }

                    int64_t subproblem_costs = INT64_MAX;
                    FF(split_width, 1, w) {
                        subproblem_costs = min(subproblem_costs, dp[h][split_width][r][c] + dp[h][w - split_width][r][c + split_width]);
                    }
                    FF(split_height, 1, h) {
                        subproblem_costs = min(subproblem_costs, dp[split_height][w][r][c] + dp[h - split_height][w][r + split_height][c]);
                    }

                    dp[h][w][r][c] = cost + subproblem_costs;

                    //cout << "dp " << h << ' ' << w << ' ' << r << ' ' << c << " = " << dp[h][w][r][c] << endl;
                }
            }
        }
    }

    cout << dp[n][m][0][0] << endl;
}

#Verdict Execution timeMemoryGrader output
Fetching results...