#include #include int n,m; int a[1005][1005]; int ans[1005][1005]; int fun(int x,int y) { if(x+y==3) return a[1][1]*a[x][y]; int res; int min=-1; if(x>1) { res=a[x][y]*a[x-1][y]; if(x>2&&((min>res+ans[x-2][y])||min==-1)) min=res+ans[x-2][y]; if(y>1&&((min>res+ans[x-1][y-1])||min==-1)) min=res+ans[x-1][y-1]; } if(y>1) { res=a[x][y]*a[x][y-1]; if(y>2&&((min>res+ans[x][y-2])||min==-1)) min=res+ans[x][y-2]; if(x>1&&((min>res+ans[x-1][y-1])||min==-1)) min=res+ans[x-1][y-1]; } return min; } int main() { int i,j,k; while(scanf("%d %d",&n,&m)!=EOF) { memset(ans,-1,sizeof(ans)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } for(i=2;i<=m;i+=2) { for(j=1;j<=i;j++) { ans[j][i+1-j]=fun(j,i+1-j); } } k=i; if(i==m+1) i=2; else i=3; for(;i<=n;i+=2,k+=2) { for(j=m;j>=k-m;j--) { ans[k+1-j][j]=fun(k+1-j,j); } } printf("%d\n",ans[n][m]); } return 0; } /* 4 3 1 2 3 2 2 1 1 2 3 2 2 1 3 4 1 2 1 2 2 2 2 2 3 1 3 1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 */