intencode( int x, int y ){ return ( x - 1 ) * n + y; }
int dx[] = { 0, 1, 0, -1 }; int dy[] = { 1, 0, -1, 0 };
voidsolve( ){ m = read( ), n = read( );
int S = 0, T = m * n + 1; init( T );
ll sum = 0;
for( int i = 1; i <= m; ++ i ) { for( int j = 1; j <= n; ++ j ) { a[i][j] = read( ); sum += a[i][j]; int id = encode( i, j ); if( ( i + j ) & 1 ) add_edge( S, id, a[i][j] ); elseadd_edge( id, T, a[i][j] ); } }
for( int i = 1; i <= m; ++ i ) { for( int j = 1; j <= n; ++ j ) { if( ( ( i + j ) & 1 ) == 0 ) continue; int id = encode( i, j ); for( int dir = 0; dir < 4; ++ dir ) { int nx = i + dx[dir]; int ny = j + dy[dir]; if( nx < 1 || nx > m || ny < 1 || ny > n ) continue; int nid = encode( nx, ny ); add_edge( id, nid, inf ); } } }
ll mncut = Dinic( S, T, T ); cout << sum - mncut << '\n'; }