#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
****************************************************************/