博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bus Planning(状压DP)
阅读量:4701 次
发布时间:2019-06-09

本文共 1416 字,大约阅读时间需要 4 分钟。

前置技能二进制枚举子集

for(int j=i;j;j=(j-1)&i)

从集合本身开始

每次-1,&i保证最后的结果一定是i的子集(0的位置不会变成1)

及每次都是从左到右消去一个1

思路:二进制枚举这n个人的子集,判断哪几个状态是能够在一辆车上的,然后对于所有状态判断他的哪两个互补的子集能使得这个状态的人最少。

//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f#define mem(a,b) memset(a,b,sizeof(a))#define ll long long#define sd(x) scanf("%d",&(x))#define sl(x) scanf("%lld",&(x))#define slf(x) scanf("%lf",&(x))#define scs(s) scanf("%s",s)#define rep(i,a,b) for(int i=a;i<=b;i++)#define per(i,a,b) for(int i=a;i>=b;i--)#define lowbit(x) x&(-x)#define ls now<<1#define rs now<<1|1#define lson l,mid,ls#define rson mid+1,r,rs#define All L,Rusing namespace std;const int maxn=3e5+10;const int mod=998244353;map
q;string s[20];int nmap[20][20],tot=0;int n,m,k,ans=inf,vis[maxn],tans[maxn],dp[maxn],t[35];int cheek(int mub){ for(int i=1;i<=mub;i++) { for(int j=1;j<=mub;j++) { if(nmap[t[i]][t[j]]) return 0; } } return 1;}void dfs(int u){ if(dp[u]==1) { for(int i=0;i
>s[i],q[s[i]]=i; rep(i,1,m) cin>>a>>b,nmap[q[a]][q[b]]=nmap[q[b]][q[a]]=1; int N=(1<
>=1; } dp[i]=inf; if(mub>k) continue; if(cheek(mub))dp[i]=1; } for(int i=1;i<=N;i++) { for(int j=i;j;j=(j-1)&i) { if(dp[i]>dp[i^j]+dp[j]) { dp[i]=dp[i^j]+dp[j]; vis[i]=j; } } } cout<
<

 

转载于:https://www.cnblogs.com/minun/p/11338000.html

你可能感兴趣的文章
多线程中,NSOperationQueue和GCD的区别
查看>>
python生成.exe文件
查看>>
PHP面向对象(OOP)----分页类
查看>>
监听SD卡状态
查看>>
vs2017 EFCore 迁移数据库命令
查看>>
serialVersionUID的作用
查看>>
liunx trac 插件使用之GanttCalendarPlugin
查看>>
(14)嵌入式软件开发工程师技能要求总结
查看>>
[hackerrank]Closest Number
查看>>
volatile关键字
查看>>
[Android] TabLayout设置下划线(Indicator)宽度
查看>>
<潭州教育>-Python学习笔记@条件与循环
查看>>
web自动化之验证码识别解决方案
查看>>
netty接收大文件的方法
查看>>
软件工程设计之四则运算
查看>>
SpringMVC @ResponseBody 406
查看>>
HDOJ---2824 The Euler function[欧拉函数]
查看>>
KMP算法
查看>>
Atlas学习之开始篇[转]
查看>>
第二章 在HTML页面里使用javaScript
查看>>