[ABC318D] General Weighted Max Matching 状压dp
作者:
多米尼克領主的致意
,
2024-05-25 14:57:41
,
所有人可见
,
阅读 5
O(2^n * n^2)
状态转移方程:
f[s] = max(f[s], f[s^(1 << j)^(1 << k)] + dist[j][k]);
0表示没有出现过 1表示此点已经选中
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll f[1 << 17];
ll dist[20][20];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 0;i < n;i++){
for(int j = i + 1;j < n;j++){
int d;
cin >> d;
dist[i][j] = dist[j][i] = d;
}
}
ll ans = 0;
for(int s = 0;s <= (1 << n) - 1;s++){
for(int j = 0;j < n;j++){
if(s & (1 << j)){
for(int k = 0;k < n;k++){
if((s^(1 << j)) & (1 << k)){
f[s] = max(f[s], f[s^(1 << j)^(1 << k)] + dist[j][k]);
ans = max(ans, f[s]);
}
}
}
}
}
// for(int i = 0;i < (1 << n);i++)ans = max(ans, f[i]);
cout << ans;
return 0;
}