LightOJ-1011-Marriage Ceremonies [状态压缩][DP]

来源:互联网 发布:win10 办公软件 编辑:程序博客网 时间:2024/05/25 18:09

题目传送门


题意:给n对男女两两之间的好感度,求将他们所有两两结合起来得到的最大好感度。

思路:状压DP,dp[i][j]表示选前i个人的j种选法的最大好感度。

#include <bits/stdc++.h>using namespace std;int dp[20][70000];int a[20][20];int main(void){    int T, cas=1;    scanf("%d", &T);    while (T--)    {        int n;        scanf("%d", &n);        for (int i = 1; i <= n; i++)        {            for (int j = 1; j <= n; j++)            {                scanf("%d", &a[i][j]);            }        }        int maxn = 1<<n;        for (int i = 0; i <= n; i++)            for (int j = 0; j <= maxn; j++)                dp[i][j] = 0;        for (int i = 1; i <= n; i++)        {            for (int j = 0; j < maxn; j++)            {                for (int k = 1; k <= n; k++)                {                    int t = 1<<(k-1);                    if ((j&t)==0)                    {                        dp[i][j|t] = max(dp[i][j|t], dp[i-1][j]+a[i][k]);                    }                }            }        }        printf("Case %d: %d\n", cas++, dp[n][(1<<n)-1]);    }    return 0;}