uestc1608+状压+记忆化

题意

1
给你n个人 3个人一队,每三个人有一个默契度,问n/3队的最大总和默契度!

题解

1
一般记忆化搜索都是暴力,只是加一个记忆化就行了!!!

总结

1
2


code

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

using namespace std;
const int Maxn=100005;
typedef pair<int,int> pii;
int n,a[22][22][22],dp[(1<<21)+5];
int (int s){
int i,j,k;
if(s==0) return 0;
if(dp[s]!=-1) return dp[s];
for(i=0;i<n-2;i++)
if(s&(1<<i)) break;
for(j=i+1;j<n-1;j++)
if(s&(1<<j))
for(int k=j+1;k<n;k++)
if(s&(1<<k)) dp[s]=max(dp[s],dfs((s^(1<<i)^(1<<j)^(1<<k)))+a[i][j][k]);
return dp[s];
}
int main()
{
int x,y,z,k;
scanf("%d",&n);
int tot=n*(n-1)*(n-2)/6;
for(int i=1;i<=tot;i++)
{
scanf("%d%d%d%d",&x,&y,&z,&k);
a[x-1][y-1][z-1]=k;
}
dfs((1<<n)-1);
memset(dp,-1,sizeof(dp));
printf("%d",dfs((1<<n)-1));
return 0;
}