hrbust/哈理工oj 1809 再就业【状压dp】
再就业 | ||||||
|
||||||
Description | ||||||
修水管没修好,小胖子又失业了,于是又找了一份在婚姻介绍所的工作,现在老板又给小胖子出难题了,如果小胖子能解决,就可以重新再就业了。 这里有n对男女士,任意一个男生对一个女生都有一个好感值,任意一个女生也对一个男生有好感值,给出一个好感值表,为了方便,用n*n的矩阵表示,(i,j)表示第i行表示男士(或女士)对第j列的女士(或男士)的好感度,问怎么安排n对相亲才能使成功率最大,并且不存在搞基等事件发生。 小胖子感慨,没文化真可怕,工作都没了。 |
||||||
Input | ||||||
第一行输入一个整数t,代表测试次数,t不超过100。 对于每组数据的第一行输入一个整数n,代表有多少对男女生,n大于0不超过16。 接下来是一个n*n的矩阵,每个数字分别表示i和j之间的好感度,好感度不超过10000。 |
||||||
Output | ||||||
输出最大相亲的好感和。 | ||||||
Sample Input | ||||||
2 2 1 5 2 1 3 1 2 3 6 5 4 8 1 2 |
||||||
Sample Output | ||||||
7 |
||||||
Author | ||||||
sunshine@hrbust |
状压dp都是300+ms过的,看到几位大神在理工oj上边用KM算法秒到2ms,简直不是人......................图论渣表示还是去老老实实的用状压dp来搞定这个问题。
思路:
我们设dp【i】【j】表示第i行j状态的最大好感值的和。
对于状态j。假设j的值为5:,对应二进制的值为101,表示选取了第0行和第2行上边的女孩。
辣么不难推出:
dp【i+1】【q((1<<k)+j)】=max(dp【i+1】【q((1<<k)+j)】,dp【i】【j】+a【i+1】【k】);
我们初始化dp矩阵为-1,然后初始化第0行dp【0】【1<<j】=a【0】【j】,然后向下一行开始dp,枚举第0行的j状态,如果当前这种状态有值(不为-1)的话,我们再枚举一下k,如果(j&(1<<k)!=0)【与运算同1为1,其他为0,可以方便用来判断当前状态里边是否已经选取了第k列的女孩】辣么说明j状态里边没有选取第k列的女孩。辣么就能符合状态转移方程。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int a[17][17];
int dp[17][1<<17];
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){scanf("%d",&a[i][j]);}}//printf("yes\n");int end=1<<n;memset(dp,-1,sizeof(dp));for(int j=0;j<n;j++){dp[0][1<<j]=a[0][j];}for(int i=0;i<n-1;i++){for(int j=0;j<end;j++){if(dp[i][j]==-1)continue;else{for(int k=0;k<n;k++){int tmp=1<<k;if(j&tmp)continue;dp[i+1][j+tmp]=max(dp[i+1][j+tmp],dp[i][j]+a[i+1][k]);}}}}int output=0;for(int i=0;i<end;i++){if(dp[n-1][i]>output)output=dp[n-1][i];}printf("%d\n",output);}
}
hrbust/哈理工oj 1809 再就业【状压dp】相关推荐
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- P2340 奶牛会展(状压dp)
P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- Codeforces Gym 100676G Training Camp 状压dp
http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...
- 【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...
- 最短Hamilton路径(状压dp)
链接:https://ac.nowcoder.com/acm/problem/50909 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
最新文章
- Java NIO编程的技巧和陷阱
- 21天舞动西浦报名失败的教训:先下手为强
- linux下静态库和动态库的制作与使用
- .net的轻量级ORM -- PetaPoco/NPOCO框架使用说明
- axure 链接html文件,通过WuliHub免费托管原型Axure HTML文件
- Linux|麒麟操作系统实现多路RTMP|RTSP播放
- Lucas(卢卡斯)定理
- java 终止方法_Java中终止线程的三种方法
- day2_windows下zip安装wamp环境
- 前台页面操作文件属性。
- mysql var目录很快_mysql数据库实现亿级数据快速清理的方法
- 局域网IP搜索小工具
- 魔方矩阵c语言,C语言检验并打印魔方矩阵,检验并打印魔方矩阵,用C语言,求大神尽快解决...
- 电脑截图怎么转换成文字?学会这个方法,轻松实现
- Java代理和动态代理机制分析和应用
- AutoCAD打印样式中缺少.ctb只有.stb怎么办?
- vim 配置(ma6174 + YCM)
- P2882 [USACO07MAR]Face The Right Way G 【贪心 + 差分】
- 【大数据----Spark】Spark入门教程[3]
- MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G