Submission #1196286

#TimeUsernameProblemLanguageResultExecution timeMemory
1196286h1440Raisins (IOI09_raisins)C++20
100 / 100
650 ms34744 KiB
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define fore(i,a,b) for(lli i = (a), abcdxd = (b); i < abcdxd; i++)
#define f first
#define s second
#define ENDL '\n'
#define pb push_back
#define sz(s) lli((s).size())
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
using namespace std;
typedef long long lli;
// typedef long long LLI;
typedef pair<lli,lli> ii;
typedef vector<lli> vi;
typedef vector<ii> vii;
typedef long double ld;
#define deb(x) cout << #x << ": " << x << endl;
#define BIGLLI __int128
typedef vector<vi> mtrx;

const lli N = 55;
const lli INF = 1e18 + 12;

lli n, m;

lli v[N][N];

lli dp[N][N][N][N];
bool vis[N][N][N][N];

lli calc(lli lx, lli rx, lli ly, lli ry){
  if (lx > rx or ly > ry) return 0;
  if (lx == rx and ly == ry) return 0;
  auto &ans = dp[lx][rx][ly][ry];
  auto &mem = vis[lx][rx][ly][ry];
  if (!mem){
    mem = true;
    ans = INF;
    lli sum = 0; fore(i,lx,rx+1) fore(j,ly,ry+1) sum += v[i][j];
    fore(i,lx,rx) ans = min(ans, sum + calc(lx, i, ly, ry) + calc(i+1, rx, ly, ry));
    fore(j,ly,ry) ans = min(ans, sum + calc(lx, rx, ly, j) + calc(lx, rx, j+1, ry));
  }
  return ans;
}

void solve(){
  cin >> n >> m;
  fore(i,0,n) fore(j,0,m) cin >> v[i][j];
  cout << calc(0, n-1, 0, m-1) << endl;
}

int main(){
  // lli t; cin >> t;
  // while (t--)
    solve();
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...