1+ #pragma GCC optimize("Ofast")
2+ #pragma GCC optimize("unroll-loops")
3+ #include < bits/stdc++.h>
4+ using namespace std ;
5+
6+ typedef long long ll;
7+ typedef vector<int > vi;
8+ #define fast_cin () \
9+ ios_base::sync_with_stdio (false ); \
10+ cin.tie(NULL ); \
11+ cout.tie(NULL );
12+
13+ int n;
14+ vector<vector<int >> heights;
15+ vector<vector<ll>> memo;
16+ vector<ll> costs;
17+ constexpr ll inf = 1e18 ;
18+ ll dp (int idx, int prev_up) {
19+ if (idx == n) return 0 ;
20+ if (memo[idx][prev_up] != -1 ) return memo[idx][prev_up];
21+ if (idx == 0 ) return min (dp (idx + 1 , 0 ), dp (idx + 1 , 1 ) + costs[idx]);
22+
23+ // we need to check if we can no upgrade this current row
24+ bool same_can = true ;
25+ for (int c = 0 ; c < n; c++) {
26+ if (heights[idx][c] == heights[idx - 1 ][c] + prev_up) {
27+ same_can = false ;
28+ break ;
29+ }
30+ }
31+
32+ bool up_can = true ;
33+ for (int c = 0 ; c < n; c++) {
34+ if (heights[idx][c] + 1 == heights[idx - 1 ][c] + prev_up) {
35+ up_can = false ;
36+ break ;
37+ }
38+ }
39+
40+ if (same_can && up_can) {
41+ return memo[idx][prev_up] = min (dp (idx + 1 , 0 ), dp (idx + 1 , 1 ) + costs[idx]);
42+ } else if (same_can) {
43+ return memo[idx][prev_up] = dp (idx + 1 , 0 );
44+ } else if (up_can) {
45+ return memo[idx][prev_up] = dp (idx + 1 , 1 ) + costs[idx];
46+ } else {
47+ return memo[idx][prev_up] = inf;
48+ }
49+ }
50+
51+ void solve () {
52+ cin >> n;
53+ heights.assign (n, vector<int >(n));
54+ memo.assign (n, vector<ll>(2 , -1 ));
55+
56+ for (int i = 0 ; i < n; i++) {
57+ for (int j = 0 ; j < n; j++) {
58+ cin >> heights[i][j];
59+ }
60+ }
61+
62+ costs.assign (n, 0 );
63+ for (auto &x : costs) {
64+ cin >> x;
65+ }
66+
67+ ll ans = dp (0 , 0 );
68+
69+ // transpose the matrix
70+ for (int i = 0 ; i < n; i++) {
71+ for (int j = i + 1 ; j < n; j++) {
72+ swap (heights[i][j], heights[j][i]);
73+ }
74+ }
75+
76+ memo.assign (n, vector<ll>(2 , -1 ));
77+ for (auto &x : costs) {
78+ cin >> x;
79+ }
80+
81+ ans += dp (0 , 0 );
82+ cout << (ans >= inf ? -1 : ans) << ' \n ' ;
83+ }
84+
85+ int main () {
86+ int tc;
87+ cin >> tc;
88+ while (tc--) solve ();
89+ }
0 commit comments