博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UVA 11825] Hackers' Crackdown
阅读量:5927 次
发布时间:2019-06-19

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

图片加载可能有点慢,请跳过题面先看题解,谢谢

1196604-20171012150422371-656313214.png
1196604-20171012150427355-2137018233.png
1196604-20171012150431449-26317639.png

这道题目把模型简化后其实很简单,简化后的模型为:

有许多个小集合 \(P0,P2...Pn-1\) (即每个节点和与它相邻节点的并为 \(P\) ),现在要求出一种分组方式,使得每一组的元素的并为全集并且组数最多
$
$
我们注意到,\(n\) 很小,完全可以将 \(P\) 压成一个二进制数,那么这就是一个比较简单的子集 \(dp\) 了。
\(vis[i]\) 为,在 \(i\) 状态下的覆盖情况(\(i\) 是一个二进制数,表示 \(P\) 的选取状态);
\(f[i]\) 为, 在 \(i\) 状态下能破坏的最大服务数(\(i\) 同上),则答案为 \(f[(1<<n)-1]\)
$
$
那么转移就很好写了:$f[i]=max(f[i],f[i $ ^ j]+1)\(,其中,\)\(j\)\(i\) 的子集且 \(vis[j]=(1<<n)-1\)
另附枚举 \(i\) 的子集 \(j\) 的方式:for(j=i;j;j=(j-1)&i)

//made by Hero_of_Someone#include
#include
#include
#define il inline#define RG registerusing namespace std;il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar(); if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int t,n,p[54],vis[1<<20],f[1<<20];il void init(){ for(int i=0;i

转载于:https://www.cnblogs.com/Hero-of-someone/p/7656314.html

你可能感兴趣的文章
js闭包
查看>>
度量时间差
查看>>
网络营销与电子商务
查看>>
可输入的模糊搜索ComBox控件
查看>>
MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索
查看>>
Linux 下mysql永久更改字符集
查看>>
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>
lvs
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
JS页面刷新保持数据不丢失
查看>>
最浅显易懂的数据库索引讲解
查看>>
清橙A1202&Bzoj2201:彩色圆环
查看>>
使用data pump工具的准备
查看>>
springMVC---级联属性
查看>>
get和post区别
查看>>
是机遇还是挑战?---浅谈谷歌收购摩托罗拉移动
查看>>
项目总结26:java调用webservice接口(asmx)
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
基于HTML5手机上下滑动翻页特效
查看>>