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