Submission #1215707

#TimeUsernameProblemLanguageResultExecution timeMemory
1215707DippleThreeRaisins (IOI09_raisins)C++20
100 / 100
127 ms29508 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int r, c; cin >> r >> c;
    vector<vector<int>> grid(r, vector<int>(c));
    vector<vector<vector<vector<int>>>> dp(r, vector<vector<vector<int>>>(c, vector<vector<int>>(r, vector<int>(c, 1e8)))); // dp[dr][dc][sr][sc]
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> grid[i][j];
            dp[0][0][i][j] = 0;
        }
    }
    for (int i = 0; i < r; i++){
        for (int j = 1; j < c; j++){
            grid[i][j] += grid[i][j - 1];
        }
    }
    for (int i = 1; i < r; i++){
        for (int j = 0; j < c; j++){
            grid[i][j] += grid[i - 1][j];
        }
    }
    for (int dr = 0; dr < r; dr++){
        for (int dc = 0; dc < c; dc++){
            if (dr == 0 && dc == 0) continue;
            for (int sr = 0; sr + dr < r; sr++){
                for (int sc = 0; sc + dc < c; sc++){
                    int base = grid[sr + dr][sc + dc];
                    if (sr > 0) base -= grid[sr - 1][sc + dc];
                    if (sc > 0) base -= grid[sr + dr][sc - 1];
                    if (sr > 0 && sc > 0) base += grid[sr - 1][sc - 1];
                    for (int ddr = 1; ddr <= dr; ddr++){
                        dp[dr][dc][sr][sc] = min(dp[dr][dc][sr][sc], base + dp[ddr - 1][dc][sr][sc] + dp[dr - ddr][dc][sr + ddr][sc]);
                    }
                    for (int ddc = 1; ddc <= dc; ddc++){
                        dp[dr][dc][sr][sc] = min(dp[dr][dc][sr][sc], base + dp[dr][ddc - 1][sr][sc] + dp[dr][dc - ddc][sr][sc + ddc]);
                    }
                }
            }
        }
    }
    cout << dp[r - 1][c - 1][0][0] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...