light 1011 - Marriage Ceremonies

来源:互联网 发布:沈阳系统i5编程实例 编辑:程序博客网 时间:2024/06/05 18:55

dp[n][1<<n] 第一维 表示第i个男士,第二维 的二进制第几位有1 表示,第几个女士已经和前i个男士中的某个搭伙了

dp[i][s|(1<<j)] = max(dp[i][s|(1<<j)] , dp[i-1][s] + map[i][j+1]);





#include <queue>#include <cstdio>#include <utility>#include <cstring>#include <algorithm>using namespace std;int map[20][20];int n;int dp[20][66000];int main(){    int t;    int cnt = 0;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d", &map[i][j]);            }        }        memset(dp,0,sizeof(dp));        for(int i = 0; i < n; i++)        {            dp[1][1<<i] = map[1][i+1];        }        for(int i = 2; i <= n; i++)        {            for(int s = 0; s < (1<<n); s++)            {                if(dp[i-1][s] != 0)                {                    for(int j = 0; j < n; j++)                    {                        if(! (s & (1<<j)))//第j个女士单着,试试脱单                        {                            if(dp[i][s|(1<<j)] < dp[i-1][s] + map[i][j+1])                            {                                dp[i][s|(1<<j)] = dp[i-1][s] + map[i][j+1];                            }                        }                    }                }            }        }        printf("Case %d: %d\n", ++cnt, dp[n][(1<<n)-1]);    }    return 0;}








0 0
原创粉丝点击