您的位置:首页 > 其它

Lightoj 1011 Marriage Ceremonies(状压dp入门 or km板子)

2017-07-19 13:10 477 查看
题意:给你n*n的矩阵,a[i][j]代表第i个男人和第j个女人之间的满意度,求男女一一配对后,最大的满意度之和。(n<=16)

思路:可以直接套KM板子,n^3复杂度,因为n比较小,也可以用状压做,n^2*2^n复杂度

转移方程:dp[i][sta|(1<<j)] = max(dp[i][sta|(1<<j)], dp[i-1][sta]+a[i][j])

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 17;
int dp[maxn][1<<maxn], a[maxn][maxn];

int main(void)
{
int t, n, ca = 1;
cin >> t;
while(t--)
{
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &a[i][j]), dp[i][1<<j] = a[i][j];
for(int i = 1; i < n; i++)
for(int j = 0; j < (1<<n); j++)
{
if(dp[i-1][j])
{
for(int k = 0; k < n; k++)
{
if(!(j & (1<<k)))
{
dp[i][j|(1<<k)] = max(dp[i][j|(1<<k)], dp[i-1][j]+a[i][k]);
}
}
}
}
printf("Case %d: %d\n", ca++, dp[n-1][(1<<n)-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lightoj dp