#include #include #include #include #include #define MAX 1024 using namespace std; typedef long long i64; int a[MAX][MAX]; i64 dp[MAX][MAX]; i64 Solve(int n, int m) { memset(dp, 0x3F, sizeof(dp)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (!i && !j) dp[i][j] = 0; else if (!i) { if (j & 1) { dp[i][j] = min(dp[i][j], dp[i][j - 1] + a[i][j - 1] * a[i][j]); } else { dp[i][j] = min(dp[i][j], dp[i][j - 1]); } } else if (!j) { if (i & 1) { dp[i][j] = min(dp[i][j], dp[i - 1][j] + a[i - 1][j] * a[i][j]); } else { dp[i][j] = min(dp[i][j], dp[i - 1][j]); } } else { if ((i + j) & 1) { dp[i][j] = min(dp[i][j], min( dp[i][j - 1] + a[i][j - 1] * a[i][j], dp[i -1 ][j] + a[i - 1][j] * a[i][j])); } else { dp[i][j] = min(dp[i][j], min(dp[i][j - 1], dp[i - 1][j])); } } } } return dp[n - 1][m - 1]; } int main() { int n, m; while (~scanf("%d%d", &n, &m)) { for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { scanf("%d", &a[i][j]); } } cout << Solve(n, m) << endl; } return 0; }