#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<ll>> S, c;
vector<vector<vector<vector<ll>>>> DP;
ll TS(ll a, ll b, ll x, ll y){
ll s = 0;
for(ll i=a;i<=x;i++){
s += S[i][y+1] - S[i][b];
}
return s;
}
ll calc(ll a, ll b, ll x, ll y){
if(DP[a][b][x][y] != -1){return DP[a][b][x][y];}
if(a==x and b==y){return DP[a][b][x][y] = 0;}
ll mn = 125*1e8;
for(ll i=b+1;i<=y;i++){
mn = min(mn, calc(a, b, x, i-1) + calc(a, i, x, y));
}
for(ll i=a+1;i<=x;i++){
mn = min(mn, calc(a, b, i-1, y) + calc(i, b, x, y));
}
return DP[a][b][x][y] = TS(a, b, x, y) + mn;
}
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
ll N, M;
cin>>N>>M;
c.resize(N, vector<ll>(M));
S.resize(N, vector<ll>(M+1, 0));
DP.resize(N, vector<vector<vector<ll>>>(M, vector<vector<ll>>(N, vector<ll>(M, -1))));
for(ll i=0;i<N;i++){
for(ll j=0;j<M;j++){
S[i][j+1] = S[i][j];
cin>>c[i][j];
S[i][j+1] += c[i][j];
}
}
cout<<calc(0, 0, N-1, M-1);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |