1 #include <cmath>
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 #include <algorithm>
6 using namespace std;
7
8 const int INF = 0x3f3f3f3f;
9
10 int n, t[1010], b[1010], f[1010][256][20];
11
12 int main()
13 {
14 int T;
15 cin >> T;
16 while (T--)
17 {
18 cin >> n;
19 for (int i = 1; i <= n; i++)
20 {
21 cin >> t[i] >> b[i];
22 }
23 memset(f, 0x3f, sizeof(f));
24 f[1][0][7] = 0;
25 for (int i = 1; i <= n; i++)
26 for (int j = 0; j < 256; j++)
27 for (int k = -8; k <= 7; k++)
28 if (f[i][j][k + 8] != INF)
29 {
30 if (j & 1) f[i + 1][j >> 1][k + 7] = min(f[i + 1][j >> 1][k + 7], f[i][j][k + 8]);
31 else
32 {
33 int l = INF;
34 for (int h = 0; h <= 7; h++)
35 if (!((j >> h) & 1))
36 {
37 if (i + h > l) break;
38 l = min(l, i + h + b[i + h]);
39 f[i][j | (1 << h)][h + 8] = min(f[i][j | (1 << h)][h + 8], f[i][j][k + 8] + (i + k ? (t[i + k] ^ t[i + h]) : 0));
40 }
41 }
42 }
43 int mint = INF;
44 for (int i = 0; i <= 8; i++)
45 mint = min(mint, f[n + 1][0][i]);
46 cout << mint << endl;
47 }
48 }
知识兔View Code