// Source: https://usaco.guide/general/io
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fs first
#define sc second
const int N=52;
int a[N][N],dp[N][N][N][N],pr[N][N];
int cnt(int x1, int x2, int y1, int y2){
int sum=pr[x2][y2]-pr[x1-1][y2]-pr[x2][y1-1]+pr[x1-1][y1-1];
return sum;
}
void solve(int x1,int x2 ,int y1, int y2 ){
if (dp[x1][x2][y1][y2] != 1e9) return;
if(x1==x2 and y1==y2 ){
dp[x1][x2][y1][y2]=0;
return ;
}
for(int i=y1; i<y2; i++){
solve(x1,x2,y1,i);
solve(x1,x2,i+1,y2);
dp[x1][x2][y1][y2]=min(dp[x1][x2][y1][y2],dp[x1][x2][y1][i]+dp[x1][x2][i+1][y2]+cnt(x1,x2,y1,y2));
}
for(int i=x1; i<x2; i++){
solve(x1,i,y1,y2);
solve(i+1,x2,y1,y2);
dp[x1][x2][y1][y2]=min(dp[x1][x2][y1][y2],dp[x1][i][y1][y2]+dp[i+1][x2][y1][y2]+cnt(x1,x2,y1,y2));
}
}
signed main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin>>a[i][j];
}
}
//x simagle
//y sigrdze
//x1 y1
// x2 y2
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
pr[i][j]=pr[i-1][j]+pr[i][j-1]-pr[i-1][j-1]+a[i][j];
}
}
for(int i=1; i<=50; i++){
for(int i1=1; i1<=50; i1++){
for(int i2=1; i2<=50; i2++){
for(int i3=1; i3<=50; i3++){
dp[i][i1][i2][i3]=1e9;
}
}
}
}
solve(1,n,1,m);
cout<<dp[1][n][1][m]<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |