#include #include #include #include #include #include #include #include using namespace std; typedef long long LL; LL dp[1100][1100],a[1100][1100],n,m,i,j; LL dfs(LL o,LL p){ if(o<0||p<0)return 0x3f3f3f3f; LL &now=dp[o][p]; if(now!=-1)return now; now=0x3f3f3f3f; now=min(now,dfs(o-2,p)+a[o-1][p]*a[o][p]); now=min(now,dfs(o,p-2)+a[o][p-1]*a[o][p]); now=min(now,dfs(o-1,p-1)+a[o][p-1]*a[o][p]); now=min(now,dfs(o-1,p-1)+a[o-1][p]*a[o][p]); // printf("%I64d %I64d %I64d\n",dfs(o-2,p),dfs(o,p-2),dfs(o-1,p-1)); return now; } int main(){ while(~scanf("%I64d%I64d",&n,&m)){ for(i=1;i<=n;++i){ for(j=1;j<=m;++j){ scanf("%I64d",&a[i][j]); } } for(i=1;i<=n;++i)a[i][0]=0x3f3f3f3f; for(i=0;i<=m;++i)a[0][i]=0x3f3f3f3f; memset(dp,-1,sizeof(dp)); for(i=1;i<=n;++i)dp[i][0]=0x3f3f3f3f; for(i=0;i<=m;++i)dp[0][i]=0x3f3f3f3f; dp[0][1]=0; dp[1][0]=0; printf("%I64d\n",dfs(n,m)); } return 0; }