#include<stdio.h>
#include<math.h>
#include<string.h>
int Min(int a,int b)
{
return a<b?a:b;
}
int abcd(int a,int b)
{
if(a-b>0)
return a-b;
else
return b-a;
}
int main()
{
int n,m,i,j,ff,k,flag,dp[25][25];
int Map[25][15];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&Map[i][j]);
dp[i][j]=999999999;
}
}
for(i=1;i<=m;i++)
dp[1][i]=0;
for(i=2; i<=n; i++)
{
for(j=1; j<=m; j++)
{
for(k=1; k<=m; k++)
{
dp[i][j]=Min(dp[i][j],dp[i-1][k]+abcd(Map[i][j],Map[i-1][k]));//由上往下dp
}
}
}
int Mi=999999999;
for(i=1; i<=m; i++)
if(Mi>dp[n][i])
Mi =dp[n][i];
printf("%d\n",Mi);
}
return 0;
}//需要注意的是当花费最小时(可能多个)要找一个以前花费最小的
/*
3 2
1 2
14 10
12 20
*/
//动态转移方程式是dp[i][j]=Min(dp[i][j],dp[i-1][k]+abcd(Map[i][j],Map[i-1][k]));
//由上往下dp和由下往上dp
#include<stdio.h>
#include<math.h>
#include<string.h>
int Min(int a,int b)
{
return a<b?a:b;
}
int abcd(int a,int b)
{
if(a-b>0)
return a-b;
else
return b-a;
}
int main()
{
int n,m,i,j,ff,k,flag,dp[25][25];
int Map[25][15];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&Map[i][j]);
dp[i][j]=999999999;
}
}
for(i=1;i<=m;i++)
dp[n][i]=0;
for(i=n-1; i>0;
i--)
{
for(j=1; j<=m; j++)
{
for(k=1; k<=m; k++)
{
dp[i][j]=Min(dp[i][j],dp[i+1][k]+abcd(Map[i][j],Map[i+1][k]));//由下往上dp
}
}
}
int Mi=999999999;
for(i=1; i<=m; i++)
if(Mi>dp[1][i])
Mi =dp[1][i];
printf("%d\n",Mi);
}
return 0;
}