0%

D.Dance

D - Dance

题目描述:

$ 2 \times N $ 个人,两两配对。给出一个矩阵,两两配对的值。求出结成 $ N $ 对之后, $ N $ 个值异或的最大值。

数据范围:

  • $ 1\le N \le 8 $
  • $ 0 \le A_{i, j} \lt 2^{30} $

题解:

直接 dfs,按照顺序来,第一个选择 i,第二个就选择大于 i 的。这样的话就比较快了。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using namespace std;
using namespace FAST_IO;
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const ll INF_LL = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-5;
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
int t, n, m, k;
int a[maxn][maxn];
int ans;
bool vis[maxn];
vector<PII> p;
void dfs(int cnt)
{
if (cnt == n)
{
int tmp = 0;
for (auto x : p)
{
tmp ^= a[x.first][x.second];
}
ans = max(ans, tmp);
return;
}
// 找到最小的id
int index = -1;
for (int i = 1; i <= 2 * n; i++)
{
if (vis[i] == false)
{
index = i;
break;
}
}
for (int i = index + 1; i <= 2 * n; i++)
{
if (vis[i] == false)
{
vis[index] = true;
vis[i] = true;
p.push_back({index, i});
dfs(cnt + 1);
vis[index] = false;
vis[i] = false;
p.pop_back();
}
}
}
int main()
{
// #define COMP_DATA
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i <= 2 * n - 1; i++)
{
for (int j = i + 1; j <= 2 * n; j++)
{
cin >> a[i][j];
}
}
dfs(0);
cout << ans << endl;
return 0;
}