#include<stdio.h>
#include<string.h>
int n,m,r,c;
int mp[20][20];
int chose[20];
int dp[20][20];
int res=0x3f3f3f3f;
inline int myabs(int a){
return a>=0?a:-a;
}
inline int mymax(int a,int b){
return a>b?a:b;
}
inline int mymin(int a,int b){
return a<b?a:b;
}
void solve(){
memset(dp,0x3f,sizeof(dp));
int f[20][20];
for(int i=1;i<m;i++){
for(int j=i+1;j<=m;j++){
f[i][j]=0;
for(int k=0;k<r;k++){
f[i][j]+=myabs(mp[chose[k]][i]-mp[chose[k]][j]);
}
}
}
int col[20];
for(int i=1;i<=m;i++){
col[i]=0;
for(int j=1;j<r;j++){
col[i]+=myabs(mp[chose[j]][i]-mp[chose[j-1]][i]);
}
}
for(int i=1;i<=m;i++){
dp[i][1]=col[i];
}
for(int i=2;i<=m;i++){
int minc=i<c?i:c;
for(int j=2;j<=minc;j++){
for(int k=j-1;k<i;k++){
dp[i][j]=mymin(dp[i][j],dp[k][j-1]+col[i]+f[k][i]);
}
}
}
for(int i=c;i<=m;i++){
res=mymin(dp[i][c],res);
}
}
void dfs(int x,int now){
if(x==r){
solve();
return;
}
if(r-x>n-now+1)return;
for(int i=now;i<=n;i++){
chose[x]=i;
dfs(x+1,i+1);
}
}
int main(){
scanf("%d%d",&n,&m);
scanf("%d%d",&r,&c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",mp[i]+j);
}
}
dfs(0,1);
printf("%d\n",res);
return 0;
}
/**************************************************************
Problem: 2333
User: admin
Language: C++
Result: Accepted
Time:228 ms
Memory:1148 kb
****************************************************************/