博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hackers’ Crackdown-----UVA11825-----DP+状态压缩
阅读量:7060 次
发布时间:2019-06-28

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

题目地址:

题目意思:

有N台机器,每台机器上有N个服务

你可以对每台机器选择关闭他以及和他相邻的机器的一种服务

当所有机器不能运行一个服务时,就是摧毁了一种服务

问你最多能摧毁多少个服务

解题思路:

这道题是大白上DP的一道例题,十分经典

对于每一个机器机器相邻的机器我们叫做Pi

那么我们就是要将Pi(i from 1 to n)尽量多的分组,使得他们的并为全集

然后在这个分组里面就可以摧毁一个服务,尽量多的分组,就是为了尽量多的摧毁服务

集合的表示和以用二进制来做,这个十分的经典

然后我们再来枚举分组的组合,用S来表示,COVER[S]就是表示这个分组的并

那么我们可以找到一个递推式

令F[S]表示以S分组的摧毁数,那么F[S] = MAX(F[S^S0],COVER[S0]为全集)+1,这里要想清楚为什么

因为S0是S的一个子集,当S0的并为全集的时候,就相当于在S0的补集上+1了,这样就清楚了

其中LRJ的代码中枚举子集的代码页很美,可以自己观摩观摩

代码本身就是学的大白的,只是说说自己的体会,见笑了。

代码:

 

#include
#include
#include
using namespace std;const int maxn = 1<<17;int f[maxn];int cover[maxn];int n,m;int p[20];int main(){ int ca=1; while(~scanf("%d",&n) && n) { for(int i=0;i

 

 

转载地址:http://fdyll.baihongyu.com/

你可能感兴趣的文章
知识图谱完整项目实战(附源码)(1)
查看>>
svn hooks同步更新
查看>>
Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解...
查看>>
Feign http 请求跟踪—乱码及连接池
查看>>
python unittest库 官方网站
查看>>
shell脚本安装 nfs-server
查看>>
System Center 2012R2之SCDPM保护SQL数据库
查看>>
課堂實驗:SIP Server
查看>>
Ubuntu中打开终端
查看>>
Linux 的启动流程
查看>>
使用eclipse与jLink V8调试exynos 4412 u-boot
查看>>
编译安装fcgiwrap
查看>>
VS2010与.NET4系列 24.使用Visual Studio2010固定项目和解决方案
查看>>
音乐天天听
查看>>
Android 权限大全
查看>>
Linux下元字符、正则表达式、扩展正则表达式应用
查看>>
ibm服务器报警指示灯含意
查看>>
Nginx Location简单语法与配置
查看>>
嵌入式C语言自我修养 06:U-boot镜像自拷贝分析:section属性
查看>>
nginx反向代理和认证反向代理
查看>>