Lightoj1011 - Marriage Ceremonies
| Time Limit: 2 second(s) | Memory Limit: 32 MB |
You work in a company which organizes marriages. Marriages are not that easy to be made, so, the job is quite hard for you.
The job gets more difficult when people come here and give their bio-data with their preference about opposite gender. Some give priorities to family background, some give priorities to education, etc.
Now your company is in a danger and you want to save your company from this financial crisis by arranging as much marriages as possible. So, you collect N bio-data of men and N bio-data of women. After analyzing quite a lot you calculated the priority index of each pair of men and women.
Finally you want to arrange N marriage ceremonies, such that the total priority index is maximized. Remember that each man should be paired with a woman and only monogamous families should be formed.
Input
Input starts with an integer T (≤ 100), denoting the number of test cases.
Each case contains an integer N (1 ≤ n ≤ 16), denoting the number of men or women. Each of the next N lines will contain N integers each. The jth integer in the ith line denotes the priority index between the ith man and jth woman. All the integers will be positive and not greater than 10000.
Output
For each case, print the case number and the maximum possible priority index after all the marriages have been arranged.
Sample Input |
Output for Sample Input |
|
2 2 1 5 2 1 3 1 2 3 6 5 4 8 1 2 |
Case 1: 7 Case 2: 16 |
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<vector>
7 using namespace std;
8 typedef long long LL;
9 typedef unsigned long long ll;
10 int dp[2][1<<16];
11 int ma[17][17];
12 typedef struct pp
13 {
14 int x;
15 int id;
16 } ss;
17 vector<ss>vec[12][1<<16];
18 int main(void)
19 {
20 int i,j,k,p,q;
21 int s;
22 for(i=5; i<=16; i++)
23 {
24 for(j=(1<<(i-1)); j<1<<16; j++)
25 {
26 int ans=0;
27 int uu=j;
28 while(uu)
29 {
30 if(uu%2)ans++;
31 uu/=2;
32 }
33 if(ans==i)
34 {
35 for(s=1; s<=16; s++)
36 {
37 if(((1<<(s-1))&j))
38 {
39 ss dd;
40 dd.x=(1<<(s-1)^j);
41 dd.id=s;
42 vec[i-5][j].push_back(dd);
43 }
44 }
45 }
46 }
47 }
48 scanf("%d",&k);
49 for(s=1; s<=k; s++)
50 {
51 scanf("%d",&p);
52 for(i=1; i<=p; i++)
53 {
54 for(j=1; j<=p; j++)
55 {
56 scanf("%d",&ma[i][j]);
57 }
58 }
59 int u;
60 int maxx=0;
61 memset(dp,0,sizeof(dp));
62 for(i=1; i<=4&&i<=p; i++)
63 { int k=i%2;
64 for(j=(1<<(i-1)); j<(1<<p); j++)
65 {
66 for(u=1; u<=p; u++)
67 {
68 if((1<<(u-1))&j)
69 {
70 int z=(1<<(u-1))^j;
71 dp[k][j]=max(dp[k][j],dp[(k+1)%2][z]+ma[i][u]);
72 maxx=max(dp[k][j],maxx);
73 }
74 }
75 }
76 }
77 for(i=5; i<=(p); i++)
78 {
79 int k=i%2;
80 for(j=(1<<(i-1)); j<(1<<p); j++)
81 {
82 for(u=0; u<vec[i-5][j].size(); u++)
83 {
84 ss kk=vec[i-5][j][u];
85 if(kk.id<=p)
86 {
87 dp[k][j]=max(dp[k][j],dp[(k+1)%2][kk.x]+ma[i][kk.id]);
88 maxx=max(dp[k][j],maxx);
89 }
90 }
91 }
92 }
93 printf("Case %d: ",s);
94 printf("%d\n",maxx);
95 }
96 return 0;
97 }
|
Developed and Maintained by
JANE ALAM JAN |
Copyright 2012
LightOJ, Jane Alam Jan |
Lightoj1011 - Marriage Ceremonies的更多相关文章
- (状压) Marriage Ceremonies (lightOJ 1011)
http://www.lightoj.com/volume_showproblem.php?problem=1011 You work in a company which organizes mar ...
- Marriage Ceremonies(状态压缩dp)
Marriage Ceremonies Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- Marriage Ceremonies LightOJ - 1011
Marriage Ceremonies LightOJ - 1011 常规状压dp.popcount(S)表示S集合中元素数量.ans[S]表示S中的女性与前popcount(S)个男性结婚的最大收益 ...
- Lightoj 1011 - Marriage Ceremonies
You work in a company which organizes marriages. Marriages are not that easy to be made, so, the job ...
- Light OJ 1011 - Marriage Ceremonies(状压DP)
题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少? 状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...
- light oj 1011 - Marriage Ceremonies
题目大意: 给出n*n的矩阵Map,Map[i][j]代表第i个男人和第j个女人之间的满意度,求男女一一配对后,最大的满意度之和. 题目思路:状态压缩 题目可看做每行取一点,所有点不同列的情况下,各个 ...
- light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
题目链接 大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的), ...
- lightoj刷题日记
提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...
- The Stable Marriage Problem
经典稳定婚姻问题 “稳定婚姻问题(The Stable Marriage Problem)”大致说的就是100个GG和100个MM按照自己的喜欢程度给所有异性打分排序.每个帅哥都凭自己好恶给每个MM打 ...
随机推荐
- 开发安卓记账本-HelloAndroid的完成
这个寒假要完成一个家庭记账本软件的开发,今天完成了Android Studio的安装与第一个安卓应用的运行(HelloAndroid) 下图是效果: 1.Android Studio的安装 可直接百度 ...
- C++一元多项式求导
这个题难度不大但是坑有点多,要考虑的点有几个: 1.测试用例为x 0 这个直接输出 0 0即可. 2.注意空格的输出 3.测试点3我好几次都没过,最后参考了别的答案加以修改才通过. 测试点3没过的代码 ...
- SpringMVC详细实例
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...
- Fragment以及懒加载
1.Fragments Fragment是Activity中用户界面的一个行为或者是一部分,你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activ ...
- Linux:cut命令...未完待续
一.定义 正如其名,cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的. 2.剪切依据 cut命令主要是接受三 ...
- Dubbo服务限流
为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流. Dubbo中能够实现服务限流的方式较多,可以划分为两 ...
- 基于阿里云 ecs 使用 docker 方式部署 showDoc
官网文档:https://www.showdoc.cc/help?page_id=65610 (建议先看下这个) 首先说明一下,我 ecs 镜像是 CentOS 7.6 64位 1. 首先在 服务器上 ...
- BigDecimal 中 关于RoundingMode介绍
RoundingMode介绍 RoundingMode是一个枚举类,有以下几个常量:UP.DOWN.CEILING.FLOOR.HALF_UP.HALF_DOWN.HALF_EVEN.UNNECESS ...
- 【Fastjson】Fastjson反序列化由浅入深
Fastjson真-简-介 fastjson是由alibaba开发并维护的一个json工具,以其特有的算法,号称最快的json库 fastjson的使用 首先先创一个简单的测试类User public ...
- Nginx模块之stub_status
目录 一.介绍 二.使用 三.参数 一.介绍 Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 当前默认在nginx的源码文件中,不需要单独下载 二.使用 本模块默认是不 ...
