#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f #define inf -0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) int mp[1010][1010]; int dp[1010][1010]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&mp[i][j]); dp[i][j]=INF; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(i==1&&j==1){ dp[i][j]=0; } else if(i==1){ if((i+j)%2==1){ dp[i][j]=dp[i][j-1]+mp[i][j-1]*mp[i][j]; } else dp[i][j]=dp[i][j-1]; } else if(j==1){ if((i+j)%2==1){ dp[i][j]=dp[i-1][j]+mp[i-1][j]*mp[i][j]; } else dp[i][j]=dp[i-1][j]; } else{ if((i+j)%2==1){ dp[i][j]=min(dp[i-1][j]+mp[i-1][j]*mp[i][j],dp[i][j-1]+mp[i][j-1]*mp[i][j]); } else dp[i][j]=min(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",dp[n][m]); } return 0; }