当前位置: 首页 > news >正文

P1382 光棍组织

我现在TMD连dfs都不会写了

原题:

MM 虽然一辈子只要一个,但是也得早点解决。于是,n 个光棍们自发组成了一个光棍组织
(ruffian organization,By Wind 乱译)。现在,光棍们打算分成几个小组,并且分头为 找 MM 事业做贡献(For example:searching,hunting……By Wind 乱译)。
对于这 n 个光棍的任意一个组合,都有一个被称为“和谐度”的东西,现在,他们想知道, 如何分组可以使和谐度总和最大。
每个光棍都必须属于某个分组,可以一个人一组。

n<=16

 

恩,把个中分组的方案和价值都直接给了,然后让选择的方案全部&起来等于(1<<n)-1(当然不能有冲突),DP想不到方法,n<=16似乎可以搜索

最开始做的时候是bfs,每次从1到(1<<n)-1找不冲突的方案,这样会T得很惨(至少要((1<<n)-1)^2)

然后容易想到是因为遍历1到(1<<n)-1过程中无效的枚举太多,所以可以直接dfs有效的状态

然后dfs傻逼了写了两天

原来写的:for(int i=z;i<n;i++)if(y&power2[i])  dfs(x,y-power2[i],i+1),dfs(x,y,i+1);

实际上应该是酱紫:if(y&power2[z])dfs(x,y-power2[z],z+1);  dfs(x,y,z+1);

原来的内种写法会有非常多的重复

在发现dfs有问题之前一直在怀疑是用了不正确的写法,参考了chad的题解又写了个分治(反向dfs)的,然后才发现dfs制杖了(分治的应该也对了)

经实测,bfs的时候搞一个spfa中的visited来表示这个元素是否在队中,如果在队中就不进队,这个优化效果还是不错的

尝试反向可以是突破点,比如反向搜索,反向枚举,甚至反向DP

代码(分治的丢了):

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int read(){int z=0,mark=1;  char ch=getchar();
 8     while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
 9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
10     return z*mark;}
11 int n,a[110000];  int power_top;
12 long long f[110000];
13 int dui[11000000],tou=0;  bool visited[110000];
14 int power2[20];  void get_power2(){power2[0]=1;for(int i=1;i<=16;i++)power2[i]=power2[i-1]<<1;}
15 void dfs(int x,int y,int z){
16     if(z==n){
17         if(f[x|y]<f[x]+a[y]){  f[x|y]=f[x]+a[y];
18         if(!visited[x|y])  dui[++tou]=x|y,visited[x|y]=true;}
19         return ;}
20     if(y&power2[z])dfs(x,y-power2[z],z+1);  dfs(x,y,z+1);}
21 void bfs(){
22     memset(visited,0,sizeof(visited));
23     dui[tou=1]=0;  f[0]=0;  visited[0]=true;
24     for(int k=1;k<=tou;k++)  dfs(dui[k],power_top^dui[k],0),visited[dui[k]]=false;}
25 int main(){//freopen("ddd.in","r",stdin);
26     memset(f,-10,sizeof(f));
27     get_power2();
28     cin>>n;  power_top=(1<<n)-1;
29     for(int i=1;i<=power_top;i++)  a[i]=read();
30     bfs();
31     cout<<f[power_top]<<endl;
32     //cout<<tou<<endl;
33     return 0;
34 }
View Code

 

转载于:https://www.cnblogs.com/JSL2018/p/6169494.html

相关文章:

  • 1.2 lambda 表达式的语法
  • Lint Code——最多共线的点的个数
  • 【bzoj1433】 ZJOI2009—假期的宿舍
  • 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
  • Liunx面试题
  • 关于面试别问及Spring如何回答思路总结!
  • Js 根据身份证号获取年龄-性别
  • linux下正确安装jsoncpp
  • hive 复杂类型
  • SQL Case when 的使用方法
  • 设计模式--适配器模式Adapter(结构型)
  • 各种文件的mime类型
  • [游戏开发-学习笔记]菜鸟慢慢飞(三)-官方教程学习小心得
  • Object类中getClass()
  • dubbo问题求解
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • co模块的前端实现
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript设计模式系列一:工厂模式
  • js对象的深浅拷贝
  • mongodb--安装和初步使用教程
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spark本地环境的搭建到运行第一个spark程序
  • use Google search engine
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给github项目添加CI badge
  • 回顾 Swift 多平台移植进度 #2
  • 开源地图数据可视化库——mapnik
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何解决微信端直接跳WAP端
  • 如何设计一个微型分布式架构?
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  •  一套莫尔斯电报听写、翻译系统
  • 正则表达式
  • 白色的风信子
  • 《码出高效》学习笔记与书中错误记录
  • puppet连载22:define用法
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #etcd#安装时出错
  • #前后端分离# 头条发布系统
  • (C语言)fgets与fputs函数详解
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EOS中账户、钱包和密钥的关系
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)利用webkit抓取动态网页和链接
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net 路由处理厉害了
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .netcore 获取appsettings