Submission #1006439

#TimeUsernameProblemLanguageResultExecution timeMemory
1006439huutuanRaisins (IOI09_raisins)C++14
100 / 100
320 ms26972 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=51;
int f[N][N][N][N], pf[N][N], a[N][N], n, m;

int dp(int x1, int y1, int x2, int y2){
   if (f[x1][y1][x2][y2]!=-1) return f[x1][y1][x2][y2];
   if (x1==x2 && y1==y2) return f[x1][y1][x2][y2]=0;
   int sum=pf[x2][y2]-pf[x1-1][y2]-pf[x2][y1-1]+pf[x1-1][y1-1];
   int ans=1e9;
   for (int x=x1; x<x2; ++x){
      ans=min(ans, dp(x1, y1, x, y2)+dp(x+1, y1, x2, y2)+sum);
   }
   for (int y=y1; y<y2; ++y){
      ans=min(ans, dp(x1, y1, x2, y)+dp(x1, y+1, x2, y2)+sum);
   }
   return f[x1][y1][x2][y2]=ans;
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> m;
   for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j){
      cin >> a[i][j];
      pf[i][j]=pf[i-1][j]+pf[i][j-1]-pf[i-1][j-1]+a[i][j];
   }
   memset(f, -1, sizeof f);
   cout << dp(1, 1, n, m) << '\n';
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...