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

本文共 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

你可能感兴趣的文章
编译原理的思维导图
查看>>
关于Spring boot 中application.yml配置文件没有小绿叶图标的问题
查看>>
JAVA vs C++之速度二
查看>>
main函数中如何等待协程运行完毕
查看>>
JS小问题之——缓冲运动
查看>>
C#导出EXCEL方法总结
查看>>
【poj3342】 Party at Hali-Bula
查看>>
SCM基础之组织结构设计
查看>>
「OC」@property @synthesize和id
查看>>
(爱加密系列教程六)Android代码注入大揭秘
查看>>
ERP程序开发中遇到的六种错误
查看>>
Hibernate_拦截器与日志文件
查看>>
2-Sixteenth Scrum Meeting-20151216
查看>>
Visual Studio 2015、2013、2012、2010、2008、2005各版本下载+有效密钥激活
查看>>
Appium键盘操作
查看>>
常见排序
查看>>
jsp自动生成验证码
查看>>
射频识别技术漫谈(12)——三次相互认证【worldsing笔记】
查看>>
flume收集日志无法在HDFS上存储
查看>>
IO多路复用(select)
查看>>