思路分析:状态压缩dp一般都是枚举状态,一层for循环,然后根据题目分别枚举元素,这题需要三层for循环
for(i)//枚举状态
{
for(j)//枚举元素a
{
//判断i状态是否有j
for(k)//枚举元素b
{
//a和b不能是同一元素
//判断i状态是否有k
}
}
}
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<algorithm>
using namespace std;
int collide[11][11];
int dp[1 << 11];
int n;
int main()
{
while (cin >> n, n)
{
memset(dp, 0, sizeof(dp));
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
cin >> collide[i][j];
}
}
int end = 1 << n - 1;
for (int i = 0;i<=end; i++)
{
for (int j = 0; j<n; j++)
{
if ((i&(1 << j)))
continue;
for (int k = 0; k<n; k++)
{
if (j == k)
continue;
if ((i&(1 << k)))
continue;
int temp= i | (1 << k);
dp[temp] = max(dp[temp], dp[i] + collide[j][k]);
}
}
}
int Max = 0;
for (int i = 0; i<(1 << n); i++)
Max = max(Max, dp[i]);
cout << Max << endl;
}
return 0;
}