ll encode( ll x[] ){ ll state = 0; for( int i = 0; i < n; ++ i ) state = state * ( m + 1 ) + x[i]; return state; }
map<ll, ll> memo;
ll dfs( ){ ll state = encode( x ); if( memo.count( state ) ) return memo[state]; int cnt = 0; for( int i = 0; i < n; ++ i ) cnt += x[i]; if( cnt == n * m ) return memo[state] = 0;
ll res; if( cnt % 2 == 0 ) { res = -inf; for( int i = 0; i < n; ++ i ) { if( x[i] == m ) continue; if( i > 0 && x[i] == x[i-1] ) continue; int j = x[i]; x[i] ++; res = max( res, a[i][j] + dfs( ) ); x[i] --; } } else { res = inf; for( int i = 0; i < n; ++ i ) { if( x[i] == m ) continue; if( i > 0 && x[i] == x[i-1] ) continue; int j = x[i]; x[i] ++; res = min( res, dfs( ) - b[i][j] ); x[i] --; } } return memo[state] = res; }
voidsolve( ){ n = read( ), m = read( ); for( int i = 0; i < n; ++ i ) { for( int j = 0; j < m; ++ j ) { a[i][j] = read( ); } } for( int i = 0; i < n; ++ i ) { for( int j = 0; j < m; ++ j ) { b[i][j] = read( ); } } cout << dfs( ) << '\n'; }